当前位置:  开发笔记 > 编程语言 > 正文

您是否仍然在C++程序中捕获内存分配失败

如何解决《您是否仍然在C++程序中捕获内存分配失败》经验,为你挑选了4个好方法。

我正在为公司写一些指导方针,我需要回答一些棘手的问题.这个很难.

解决方案可以是:

    根本不跟踪.确保使用new分配对象,这将在分配失败时引发异常.该应用程序将死亡,这不是什么大不了的事.PRO - 代码通常可以非常干净.

    跟踪内存分配失败并相应地报告,就像任何错误(例如文件访问错误)一样.

老实说,如果我们使用选项2,我必须编写更多代码.例如,许多std :: tring操作涉及内存分配.如

std :: string str1,str2; str1 = str2; str + = str2;

我们的软件将始终运行主要平台,而不是嵌入式.不知怎的,我认为选项1是要走的路.你怎么看?



1> Reed Copsey..:

我确实捕获内存分配,但只是偶尔.

特别是,我偶尔会捕获一个内存分配,其中:

我知道分配的内存量非常大

如果分配失败,我可以做些什么(即:通过向用户发出通知来优雅地处理条件等)

话虽这么说,这两件事情是非常罕见的 - 通常我最终会让程序死于异常.



2> John Feminel..:

通常,不要检查小分配上的内存分配失败.不可避免地,它比它的价值更麻烦,而且无论如何都很难做到.而且大多数时候你无能为力.在非常大的内存操作上,如果你可以对它做些什么,可能值得根据具体情况考虑事情.

这很好地涵盖了C++ Gotchas:避免编码和设计中的常见问题.特别是,请参阅问题#61:检查分配失败:

不应该问一些问题,特定的内存分配是否成功就是其中之一.

[...]所涉及的错误检查代码最初很少完全正确,并且经过一段时间的维护后几乎不会正确.更好的方法是不要检查:

String **array = new String *[n];
for( String **p = array; p < array+n; ++p )
  *p = new String;

此代码更短,更清晰,更快速,更正确.new的标准行为是在分配失败时抛出bad_alloc异常.这允许我们从程序的其余部分封装错误处理代码以分配失败,从而产生更清晰,更清晰且通常更有效的设计.



3> leeor_net..:

根据另一个建议,我这是一个真正的答案.

到目前为止,很多建议基本上都表示"bad_alloc ==你的程序中的错误".相反,bad_alloc抛出并不总是表示错误.

举个例子,我正在为我正在研究的游戏项目开发一个地图编辑器.有时使用大的地图尺寸会抛出bad_alloc.这并不表示存在错误,只是地图尺寸太大而无法容纳在用户计算机上的可用内存中.这几乎不是我希望程序崩溃的情况,并且在使用'new'运算符创建地图时使用简单的try/catch块可以恢复它.如果失败,简单,我释放剩下的任何记忆并继续随意.并非所有bad_alloc都是直截了当的,所以真正理解为什么抛出bad_alloc很重要.



4> Eclipse..:

除非您正在进行一些非常令人印象深刻的分配,否则您不太可能在32位虚拟内存空间中遇到分配失败.(在64位系统中更不可能).如果你的内存耗尽,那么死亡可能会更好.在极少数情况下出现问题并且内存不足时,您无论如何都不可能报告错误.(当然,除非你在分配失败的情况下事先将内存储备留出来免费.)

一种可能性 - 仅为紧急使用分配大量内存,然后在应用程序中以相当高的级别捕获内存异常,释放紧急内存,记录发生的事情,然后死亡.

推荐阅读
臭小子
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有