我正在阅读Scott Meyers撰写的Effective C++ 55,对项目49有疑问:

operator new无法满足内存请求时,它将调用
重复使用new-handler函数,直到找到足够的内存为止。

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

  • 释放更多的可用内存。
  • 安装其他新处理程序。
  • 卸载新处理程序
  • 引发异常
  • 不返回

  • new无法分配内存时,这意味着内存不足,问题是新处理程序如何以及从何处分配更多内存?

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

    最佳答案

    这取决于实现方式。我可以告诉你我通常的做法:

    1)新的处理程序在启动时会分配大量内存作为备用。

    2)当普通分配失败时,新处理程序将进入其预留空间。

    3)控制负载管理的代码可以挂接内存管理系统,并确定何时将其浸入备用空间。它通常会通过调整缓存和减少负载来使用react。

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

    5)恢复保留后,将通知挂钩,它们可能会增加缓存和/或恢复接受其他负载。

    6)当准备金减少时,可能失败的分配(通常为大分配)会失败。所有代码必须理智地处理大分配失败。

    7)如果储备金已用尽,则无法失败的分配(通常为小分配)会阻塞。

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

    关于c++ - 了解新处理程序的行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28541548/

    10-17 01:40