【发布时间】:2011-06-02 01:58:24
【问题描述】:
我是一名学生,我对 C++ 的了解很少,我会尝试扩展这些知识。这更像是一个哲学问题..我不是想实现什么。
自从
#include <new>
//...
T * t = new (std::nothrow) T();
if(t)
{
//...
}
//...
将隐藏异常,并且由于处理异常比简单的if(t) 更重,考虑到我们将不得不使用try-catch() 来检查一个简单的分配成功了(如果我们不这样做,就看着程序死掉)??
与使用nothrow new 相比,普通new 分配有哪些好处(如果有)?在这种情况下异常的开销是微不足道的?
另外,假设分配失败(例如,系统中不存在内存)。在那种情况下程序有什么可以做的,或者只是优雅地失败。没有办法在堆上找到空闲内存,当所有的都被保留时,有吗?
如果分配失败,并且std::bad_alloc 是thrown,我们怎么能假设由于没有足够的内存来分配对象(例如new int),会有足够的内存来存储例外??
感谢您的宝贵时间。我希望这个问题符合规则。
【问题讨论】:
-
如果上面的代码中的 new 失败。你打算在 if 语句中做什么?目前无法修复该错误。
-
@Martin,没什么。我只是对这种情况感到好奇,以及使用
nothrow是否有任何优势。其实答案让很多事情都清楚了。 -
你在内存分配中选择了一个不幸的例子。在现代桌面操作系统上运行的应用程序通常不会在内存不足时引发异常或返回错误消息。取而代之的是,整个系统只是冻结了,而操作系统则在打一场失败的战斗,即使用较慢的存储“模拟”请求的内存。但是如果应用于文件 I/O、网络访问、字符串解析或任何数量的其他任务,异常与返回码的问题是很好的。
标签: c++ out-of-memory dynamic-memory-allocation new-operator