我正在阅读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/