3

在以前的程序中,我使用以下代码来检查内存分配失败,通常没有考虑替代方案:

int* p_int = new int[10];
if(!p_int)
{
    // We failed, so exit
    return EXIT_FAILURE;
}

此方法也记录在此处

我在这里找到了语法的参考:

 p_int = (nothrow) new int[10];

这表明如果程序员没有nothrow在 new 中包含“参数”,那么检查nullptr是无效的?这个对吗?还是它依赖于操作系统?

据我了解,除非由于与此相关的开销,您实际上可以从中恢复,否则放入new一个块没有什么意义。try-catch这也是正确的吗?

4

2 回答 2

3

nullptr在 a 之后检查new是无用的,因为失败new并没有将指针设置为nullptr

int* p_int = new int[10];
if(!p_int)
{
    // error handling
}

而是一个失败的遗嘱new,所以如果你想尝试处理它,你需要和throwstd::bad_alloctrycatch

try
{
    int* p_int = new int[10];
}
catch (const std::bad_alloc& e)
{
    std::cout << "Allocation failed: " << e.what();
    // deal with it
}
于 2015-08-23T16:23:05.893 回答
2

是的,除非使用了 new 的无抛出版本(并且它没有被重载来做其他事情!)它永远不会返回 null,而是会抛出异常。至于在处理指针时对 null 的无所不在的检查,这通常是被误导的事情。最多,它应该仅限于调试版本。由于空指针只是一般不良(不可取消引用)指针的一个狭窄子类,并且它们很少出现在非调试版本中,因此检查空值只是 CPU 预热。例如,库函数通常不检查其输入是否为空。

于 2015-08-23T16:39:53.410 回答