使用new时会抛出bad_alloc异常。你还需要在继续操作之前在ptr上调用delete吗?或者你是否确信没有分配内存?
如果使用nothrow版本怎么样?如果返回nullptr,你能再次确信没有分配内存吗?
答案 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
函数模板来封装最后一位。)