New (std::nothrow) 与 try/catch 块中的 New

2024-03-12

学习后我做了一些研究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需要关心如果内存不足会发生什么?如果您所做的只是断言,那么异常方法会更好,因为它不会用随机的代码弄乱您的代码asserts。你只需让异常回退到main.

如果您确实有一个特殊的代码路径,以防您无法分配内存(也就是说,您实际上可以继续运行),则异常可能是也可能不是一种方法,具体取决于代码路径是什么。如果代码路径只是通过将指针设置为空而设置的开关,则nothrow版本会更简单。相反,如果您需要做一些完全不同的事情(从静态缓冲区中拉出,或删除一些东西,或其他什么),那么捕获std::bad_alloc相当不错。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

New (std::nothrow) 与 try/catch 块中的 New 的相关文章