如何添加新的内存分配器来处理内存不足?

时间:2012-08-05 14:33:18

标签: c++ new-operator

this answer中讨论newmalloc之间的差异,将newmalloc的差异视为Can add a new memory allocator to deal with low memory (set_new_handler)

请举例说明这一点及其工作原理?

3 个答案:

答案 0 :(得分:4)

它不是一个新的内存分配器,而是一个可以注册的函数,以便在operator new内存不足时调用它。

如果您可以神奇地修复内存不足问题,new可以再试一次,看看它现在是否能更好用。这通常不是很有用,除非你的应用程序持有它可以释放的一些内存。

答案 1 :(得分:1)

以下是一些可能使用新处理程序的示例。

  1. 假设您使用的是系统管理员所拥有的类似Unix的计算机,由于某种原因,它会对堆大小设置一个低软限制。新的处理程序可以将软限制提升到硬限制,瞧!可能有新的记忆。

  2. 假设您希望应用程序占用所有内存,但其他已在运行的应用程序仍然存在。所以只需让你的新处理程序睡一会儿。当其中一个已经运行的程序终止时,中提琴!新记忆可用。

  3. 至少有一个商业应用程序采用选项#2。这几乎总是一个错误。通常,应用程序内存不足,因为应用程序的用户无意中尝试分配比任何计算机上存在的内存更多的内存。随着其他正在运行的应用程序退出,应用程序将愉快地占用更多内存。最终无法启动新程序,包括操作系统需要运行的程序。这个应用程序是一个相当不错的工具,可以让机器崩溃。

答案 2 :(得分:-1)

我认为“低记忆”实际上表明您正在链接的答案中“内存不足”。有很多示例代码片段通过搜索set_new_handler来安装内存不足的处理程序(例如http://www.cplusplus.com/reference/std/new/set_new_handler/

我见过的一个实现(在特别是内存密集型应用程序的生产代码中)使用此钩子与应用程序启动时大约10MB的“下雨天”块分配一起使用。如果曾经触发过此处理程序,它将删除内存并尝试进入“受控退出”路径。

在实践中,我发现这不是一种非常有效的技术,因为一旦你内存不足就会出现无法预测的行为。