学习后我做了一些研究new
,不像malloc()
我习惯了,分配失败时不会返回 NULL,并且发现有两种不同的方法来检查 new 是否成功。这两种方式是:
try
{
ptr = new int[1024];
}
catch(std::bad_alloc& exc)
{
assert();
};
and
ptr = new (std::nothrow) int[1024];
if(ptr == NULL)
assert();
我相信这两种方法可以实现相同的目标(当然,如果我错了,请纠正我!),所以我的问题是这样的:
这是检查是否更好的选择new
成功了,完全基于可读性、可维护性和性能,同时忽略了事实上的 C++ 编程约定。
考虑一下你在做什么。你正在分配内存。如果由于某种原因内存分配无法工作,你assert
。如果你让std::bad_alloc
传播回main
。在发布版本中,其中assert
是一个空操作,当你的程序尝试访问内存时将会崩溃。因此,这与让异常冒泡是一样的:停止应用程序。
所以问自己一个问题:你really需要关心如果内存不足会发生什么?如果您所做的只是断言,那么异常方法会更好,因为它不会用随机的代码弄乱您的代码assert
s。你只需让异常回退到main
.
如果您确实有一个特殊的代码路径,以防您无法分配内存(也就是说,您实际上可以继续运行),则异常可能是也可能不是一种方法,具体取决于代码路径是什么。如果代码路径只是通过将指针设置为空而设置的开关,则nothrow
版本会更简单。相反,如果您需要做一些完全不同的事情(从静态缓冲区中拉出,或删除一些东西,或其他什么),那么捕获std::bad_alloc
相当不错。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)