【发布时间】:2012-08-05 23:24:57
【问题描述】:
在讨论new 和malloc 之间区别的this answer 中,new 与malloc 的区别之一为Can add a new memory allocator to deal with low memory (set_new_handler)。
请举例说明它是如何工作的?
【问题讨论】:
标签: c++ new-operator
在讨论new 和malloc 之间区别的this answer 中,new 与malloc 的区别之一为Can add a new memory allocator to deal with low memory (set_new_handler)。
请举例说明它是如何工作的?
【问题讨论】:
标签: c++ new-operator
它并不完全是一个新的内存分配器,而是一个可以注册的函数,以便在operator new 内存不足时调用它。
如果你能神奇地解决内存不足的问题,new 可以再试一次,看看它现在是否能更好地工作。这通常不是很有用,除非您的应用程序占用了一些可以释放的内存。
【讨论】:
这里有几个例子可能会用到新的处理程序。
假设您在一个类似 unix 的机器上,出于某种原因,系统管理员在该机器上设置了堆大小的软限制。新的处理程序可以将软限制提高到硬限制,瞧!可能有新的内存可用。
假设您希望您的应用程序占用所有内存,但其他已经在运行的应用程序阻碍了。因此,只需让您的新处理程序休眠一点。当其中一个已经运行的程序终止时,中提琴!新内存可用。
至少有一个商业应用程序采用选项 #2。这几乎总是一个错误。通常,应用程序的内存不足是因为应用程序的用户无意中试图分配比任何计算机上存在的内存更多的内存。当其他正在运行的应用程序退出时,该应用程序将愉快地咀嚼更多的内存。最终无法启动新程序,包括操作系统需要运行的程序。这个应用程序是一个相当不错的工具,可以让机器崩溃。
【讨论】:
我认为“内存不足”实际上也表示您链接的答案中的“内存不足”。有大量示例代码片段通过搜索 set_new_handler 来安装内存不足处理程序(例如 http://www.cplusplus.com/reference/std/new/set_new_handler/ )
我见过的一个实现(在内存特别密集的应用程序的生产代码中)将此钩子与应用程序启动时约 10MB 的“雨天”块分配结合使用。如果这个处理程序被触发过,它将删除内存并尝试进入“受控退出”路径。
在实践中,我发现这不是一种非常有效的技术,因为一旦内存不足,行为已经无法预测。
【讨论】: