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

C++ 如何添加新的内存分配器来处理内存不足?,c++,new-operator,C++,New Operator,其中讨论了new和malloc之间的区别,说明了new与malloc之间的一个区别,因为可以添加一个新的内存分配器来处理内存不足的问题(set\u new\u handler) 请给出一个例子,说明它是如何工作的?它并不完全是一个新的内存分配器,而是一个可以注册的函数,以便在运算符new内存不足时调用它 如果你能神奇地解决内存不足的问题,new可以再试一次,看看它现在是否工作得更好。这通常不是很有用,除非您的应用程序保留了一些可以释放的内存。它不是一个新的内存分配器,而是一个可以注册的函数,以便

其中讨论了
new
malloc
之间的区别,说明了
new
malloc
之间的一个区别,因为
可以添加一个新的内存分配器来处理内存不足的问题(set\u new\u handler)


请给出一个例子,说明它是如何工作的?

它并不完全是一个新的内存分配器,而是一个可以注册的函数,以便在
运算符new
内存不足时调用它


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

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

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

我认为“内存不足”实际上是指您链接的答案中的“内存不足”。有很多示例代码片段通过搜索set_new_处理程序(例如)来安装内存不足处理程序

我见过的一个实现(在一个内存特别密集的应用程序的生产代码中)在应用程序启动时将这个钩子与~10MB的“雨天”块分配结合使用。如果该处理程序被触发,它将删除内存并尝试输入“受控退出”路径

在实践中,我发现这并不是一种非常有效的技巧,因为一旦你的记忆不足,你的行为已经不可预测了。

我认为“记忆不足”实际上在你链接的答案中也表示“记忆不足”。有很多示例代码片段通过搜索set_new_处理程序(例如)来安装内存不足处理程序

我见过的一个实现(在一个内存特别密集的应用程序的生产代码中)在应用程序启动时将这个钩子与~10MB的“雨天”块分配结合使用。如果该处理程序被触发,它将删除内存并尝试输入“受控退出”路径


在实践中,我发现这并不是一种非常有效的技术,因为一旦内存不足,行为就已经不可预测了。

以下是几个新处理程序可能有用的示例

  • 假设您在一台类似unix的机器上,系统管理员出于某种原因对堆大小设置了较低的软限制。新的处理程序可以将软限制提高到硬限制,瞧!新内存可能可用

  • 假设您希望您的应用程序占用所有内存,但其他已经运行的应用程序却碍手碍脚。所以只要让你的新处理器睡一会儿就行了。当其中一个已经运行的程序终止时,viola!新内存可用


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

    这里有几个例子,可以使用新的处理器

  • 假设您在一台类似unix的机器上,系统管理员出于某种原因对堆大小设置了较低的软限制。新的处理程序可以将软限制提高到硬限制,瞧!新内存可能可用

  • 假设您希望您的应用程序占用所有内存,但其他已经运行的应用程序却碍手碍脚。所以只要让你的新处理器睡一会儿就行了。当其中一个已经运行的程序终止时,viola!新内存可用


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

    没有解释的向下投票是没有帮助的,特别是当这个答案解决了OP请求,并用真实世界的经验支持它时。请说明理由?没有解释的否决票是没有帮助的,特别是当这个答案解决了OP请求,并用现实世界的经验支持它时。请说明理由?我重申霍尔塔沃尔特对不发表评论的随机下行选民的评论。我已经在现实世界中看到了我的答案中概述的两种方法。选项#1逐渐提高堆大小的软限制,建议在某些系统上使用。也许是愚蠢的,但还是建议练习。选项#2像秃鹫一样盘旋,等待其他程序消亡,这是一种广泛使用的商业工具所使用的方法。我重申霍尔塔沃尔特对不留下评论的随机向下投票人的评论。我已经在现实世界中看到了我的答案中概述的两种方法。选项#1逐渐提高堆大小的软限制,建议在某些系统上使用。也许是愚蠢的,但还是建议练习。选项2,像秃鹫一样盘旋,等待其他程序消亡,是一种广泛使用的商业工具所使用的方法。