我是一名学生,对 C++ 的了解很少,我试图扩展它。这更多的是一个哲学问题..我并不是想实现一些东西。
Since
#include <new>
//...
T * t = new (std::nothrow) T();
if(t)
{
//...
}
//...
将隐藏异常,并且由于处理异常比简单的处理更重if(t)
,为什么不正常new T()
考虑到我们必须使用,不被认为是不太好的做法try-catch()
检查简单的分配是否成功(如果没有成功,就看着程序死掉)?
正常的有什么好处(如果有的话)new
与使用分配相比nothrow new
?在这种情况下异常的开销是微不足道的?
另外,假设分配失败(例如系统中不存在内存)。在这种情况下程序可以做些什么,或者只是优雅地失败。当所有内存都被保留时,没有办法在堆上找到空闲内存,不是吗?
如果分配失败,并且std::bad_alloc
is throw
n,我们如何假设由于没有足够的内存来分配对象(例如anew int
),会有足够的内存来存储异常?
谢谢你的时间。我希望这个问题符合规则。
自从
处理异常比较重
与简单的 if(t) 相比,为什么不呢
正常的 new T() 不考虑 less
好的做法,考虑到我们将
必须使用 try-catch() 来检查是否
简单的分配成功了(如果我们
不,只是看着程序死掉)?
有什么好处(如果有的话)
正常的新分配与
使用 nothrow new 吗?异常的
在这种情况下,开销是微不足道的
?
使用异常的惩罚确实非常重,但是(在适当调整的实现中)仅支付惩罚当抛出异常时- 因此主线情况保持非常快,并且在您的示例中两者之间不太可能有任何可测量的性能。
异常的优点是您的代码更简单:如果分配多个对象,您不必执行“分配 A; if (A) { 分配 B; if (B) 等...”。清理和终止 - 在异常和主线情况下 - 最好由 RAII 自动处理(而如果您手动检查,则还必须手动释放,这使得很容易泄漏内存)。
另外,假设分配失败
(例如,系统中不存在内存)。
该程序有什么可以做的吗
在这种情况下,或者只是失败
优雅地。没有办法找到
当一切就绪时,释放堆上的内存
预留了,有吗?
它可以做很多事情,最好的事情取决于正在编写的程序。失败并退出(优雅地或以其他方式)当然是一种选择。另一种是提前预留足够的内存,以便程序可以继续执行其功能(可能会减少功能或性能)。它也许能够释放一些自己的内存(例如,如果它维护可以在需要时重建的缓存)。或者(在服务器进程的情况下),服务器可能会拒绝处理当前请求(或拒绝接受新连接),但保持运行状态,以便客户端不会断开连接,并且一旦内存恢复,事情就可以重新开始工作返回。或者在交互式/GUI 应用程序的情况下,它可能会向用户显示错误并继续(允许他们修复内存问题并重试 - 或者至少保存他们的工作!)。
如果分配失败,并且
std::bad_alloc 被抛出,我们怎么办
假设由于没有足够的
分配对象的内存(例如
new int),会有足够的内存
存储异常?
不,通常标准库会通过提前分配少量内存来确保在内存耗尽时有足够的内存来引发异常。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)