在新的错误分配错误上,是否还需要调用删除?

时间:2017-01-19 10:11:22

标签: c++ new-operator bad-alloc nullptr

使用new时会抛出bad_alloc异常。你还需要在继续操作之前在ptr上调用delete吗?或者你是否确信没有分配内存?

如果使用nothrow版本怎么样?如果返回nullptr,你能再次确信没有分配内存吗?

2 个答案:

答案 0 :(得分:3)

当抛出异常时,你不会继续"继续" - 执行跳转到catch处理程序。

表达式如下:

p = new int;

首先评估子表达式new int。如果抛出异常,则执行不会到达赋值。 p保留之前的值(如果有的话)。

p = new(std::nothrow) int;的情况下,如果分配失败,p将成为空指针。它对空指针调用delete无效。

答案 1 :(得分:2)

new的nothrow版本确实通过返回空指针来报告错误,在这种情况下,没有分配任何内存且没有构造任何对象:

T * p = new (std::nothrow) T(a, b, c);

if (p)
{
    // stuff
}

delete p;   // OK, works on null pointers, too.

或者也许:

if (T * p = new (std::nothrow) T(a, b, c))
{
    // stuff
    delete p;
}
else
{
    // allocation failure
}

甚至更好:

if (std::unique_ptr<T> p(new (std::nothrow) T(a, b, c)))
{
    // stuff
}

最后一个版本会在if块的任何退出时自动删除动态对象,这是C ++处理多个出口并因此本地化复杂性的典型示例。

(也许应该有一个make_unique_or_null函数模板来封装最后一位。)