我知道根据C++标准,如果新的无法分配内存,它应该抛出std :: bad_alloc异常.但我听说有些编译器如VC6(或CRT实现?)不遵守它.这是真的 ?我问这个是因为在每个新语句之后检查NULL会使代码看起来非常难看.
我通常从未在C++中看到新测试,我想知道为什么.
Foo *f = new Foo;
// f is assumed as allocated, why usually, nobody test the return of new?
所以我在开发中使用Qt并且非常喜欢它.Qt对象的通常设计模式是使用它们来分配它们new.
几乎所有示例(尤其是Qt设计器生成的代码)都不会检查std::bad_alloc异常.由于分配的对象(通常是小部件等)很小,因此这几乎不成问题.毕竟,如果你没有分配20个字节之类的东西,那么你可以做的事情并不多,无法解决问题.
目前,我采用了一种策略,即在try/catch中包装"large"(大小超过一页或两页)分配.如果失败了,我会向用户显示一条消息,几乎任何更小的消息,我只会让应用程序崩溃并出现std::bad_alloc异常.
所以,我想知道这方面的思想是什么?
检查每一项new操作是否是好政策?或者只有我希望有可能失败的?
此外,在处理资源可能受到更多限制的嵌入式环境时,这显然是一个完全不同的故事.我在桌面应用程序的上下文中询问,但也会对涉及其他场景的答案感兴趣.
我今天刚开始阅读Effective C++并且到了作者谈论operator new的地步.
这本书很好地解释了如何捕获(具有不同程度的优雅)std :: bad_alloc异常,如果内存不足,操作员可以引发该异常.
我的问题是:当没有足够的内存来实例化一个对象时,你经常检查一下这个案例,如果有的话?为什么?麻烦值得吗?
我正在尝试设计一个需要动态分配一些内存的类.
我曾计划在构建期间分配它所需的内存,但是如何处理失败的内存分配?我应该抛出异常吗?我在某处读到异常应仅用于"特殊"情况,而内存耗尽对我来说似乎不是特例.
我应该在单独的初始化例程中分配内存并检查故障,然后优雅地销毁类实例吗?
或者我应该使用例外吗?如果这些内存分配失败,该类将没有任何用处.
编辑:共识似乎是内存不足是一个例外情况.
会看到如何去做这个..谢谢.. :)
c++ ×5
new-operator ×3
exception ×2
coding-style ×1
memory ×1
raii ×1
try-catch ×1
visual-c++ ×1
visual-c++-6 ×1