【发布时间】:2013-08-20 22:35:11
【问题描述】:
如果使用new 动态分配大量内存,程序可能会崩溃,因为newreturns NULL。使用异常,可以捕获 std::bad_alloc 并做最适合的事情:
try{
allocate_much_memory();
catch( std::exception e){
do_something_that_fits();
}
如果由于某种原因不能使用异常,则需要检查NULL:
BigBlob* allocate_much_memory(){
BigBlob *bblob = new BigBlob();
if( bblob == NULL ){
std::cerr << "uh-oh" << std::endl;
handle_error();
}
return bblob;
}
据我所知,关键是您必须自己编写 NULL 检查。 如果您无法更改函数,因为它来自第三方库,并且您不使用异常,该怎么办?
更新:对于我正在检查 new BigBlob() 的结果是否为 NULL 的部分:这不是必需的:请参阅 Do I need to check for NULL after p = new Fred()? 和 How can I convince my (older) compiler to automatically check new to see if it returns NULL?
【问题讨论】:
-
如果第三方库编译时出现异常,而您编译时没有异常,您将无法正确链接它们。
-
@MooingDuck:有趣,你有资源解释为什么它不起作用吗?
-
@weeska:如果跨 DLL 边界抛出异常,而另一方编译时没有异常,那一方显然无法捕获它。由于该方还假设不会有异常,因此它将无法正确展开,从而导致未定义的行为,通常是崩溃。没有办法阻止对方越界抛出异常,尽管您可以创建一个异常替换中间层。
-
我明白了,感谢您的澄清。
-
我经常使用的简单版本是这样的:将链接视为通过电话解释游戏——你必须非常、非常具体。如果我说“足球”,而我们中的一个人戴着护垫和头盔出现,而另一个人除了踢球和足球什么都没有,事情就不会顺利进行。
标签: c++ memory exception-handling