理解new-handler的行为

Sen*_*yan 17 c++ new-operator dynamic-memory-allocation

我正在阅读Scott Meyers的Effective C++ 55,并从第49项中得到一个问题:

operator new无法满足内存请求时,它会重复调用new-handler函数,直到找到足够的内存.

精心设计的newhandler函数必须执行以下操作之一:

  • 提供更多内存.
  • 安装不同的新处理程序.
  • 卸载新处理程序
  • 抛出一个例外
  • 不归路

new无法分配内存时,就意味着没有足够的内存,问题是newhandler如何以及从哪里分配更多内存?

你能解释所有这些步骤吗?

Dav*_*rtz 19

这取决于实施.我可以告诉你我通常这样做的方式:

1)新处理程序在启动时分配大量内存作为保留.

2)当普通分配失败时,新的处理程序会进入其保留状态.

3)控制负载管理的代码可以挂钩内存管理系统并确定它何时进入其保留状态.它通常通过修剪缓存和减少负载来做出反应.

4)内存管理器尝试在释放内存时重新填充其储备.

5)当保留恢复时,通知挂钩他们可能会增加缓存和/或恢复接受额外的负载.

6)当储备变低时,能够失败的分配(通常是大分配)失败.所有代码都必须妥善处理大量分配的失败.

7)如果储备金用尽,则无法失败的分配(通常是小额分配)会阻止.

8)如果阻塞条件持续存在或大分配继续失败并且无法恢复保留,则触发异常终止.


JDł*_*osz 7

它可以丢弃不是真正需要的数据.比方说,photoshop以多种比例缓存显示图像,并保持尽可能多的比例.这就是它如何知道它可以逃脱多少.