我正在为公司写一些指导方针,我需要回答一些棘手的问题.这个很难.
解决方案可以是:
根本不跟踪.确保使用new分配对象,这将在分配失败时引发异常.该应用程序将死亡,这不是什么大不了的事.PRO - 代码通常可以非常干净.
跟踪内存分配失败并相应地报告,就像任何错误(例如文件访问错误)一样.
老实说,如果我们使用选项2,我必须编写更多代码.例如,许多std :: tring操作涉及内存分配.如
std :: string str1,str2; str1 = str2; str + = str2;
我们的软件将始终运行主要平台,而不是嵌入式.不知怎的,我认为选项1是要走的路.你怎么看?
我确实捕获内存分配,但只是偶尔.
特别是,我偶尔会捕获一个内存分配,其中:
我知道分配的内存量非常大
如果分配失败,我可以做些什么(即:通过向用户发出通知来优雅地处理条件等)
话虽这么说,这两件事情是非常罕见的 - 通常我最终会让程序死于异常.
通常,不要检查小分配上的内存分配失败.不可避免地,它比它的价值更麻烦,而且无论如何都很难做到.而且大多数时候你无能为力.在非常大的内存操作上,如果你可以对它做些什么,可能值得根据具体情况考虑事情.
这很好地涵盖了C++ Gotchas:避免编码和设计中的常见问题.特别是,请参阅问题#61:检查分配失败:
不应该问一些问题,特定的内存分配是否成功就是其中之一.
[...]所涉及的错误检查代码最初很少完全正确,并且经过一段时间的维护后几乎不会正确.更好的方法是不要检查:
String **array = new String *[n]; for( String **p = array; p < array+n; ++p ) *p = new String;此代码更短,更清晰,更快速,更正确.new的标准行为是在分配失败时抛出bad_alloc异常.这允许我们从程序的其余部分封装错误处理代码以分配失败,从而产生更清晰,更清晰且通常更有效的设计.
根据另一个建议,我这是一个真正的答案.
到目前为止,很多建议基本上都表示"bad_alloc ==你的程序中的错误".相反,bad_alloc抛出并不总是表示错误.
举个例子,我正在为我正在研究的游戏项目开发一个地图编辑器.有时使用大的地图尺寸会抛出bad_alloc.这并不表示存在错误,只是地图尺寸太大而无法容纳在用户计算机上的可用内存中.这几乎不是我希望程序崩溃的情况,并且在使用'new'运算符创建地图时使用简单的try/catch块可以恢复它.如果失败,简单,我释放剩下的任何记忆并继续随意.并非所有bad_alloc都是直截了当的,所以真正理解为什么抛出bad_alloc很重要.
除非您正在进行一些非常令人印象深刻的分配,否则您不太可能在32位虚拟内存空间中遇到分配失败.(在64位系统中更不可能).如果你的内存耗尽,那么死亡可能会更好.在极少数情况下出现问题并且内存不足时,您无论如何都不可能报告错误.(当然,除非你在分配失败的情况下事先将内存储备留出来免费.)
一种可能性 - 仅为紧急使用分配大量内存,然后在应用程序中以相当高的级别捕获内存异常,释放紧急内存,记录发生的事情,然后死亡.