【发布时间】:2014-03-31 08:56:54
【问题描述】:
这样安全吗?
std::unique_ptr<A> ptr(new A[100]);
当ptr超出范围并调用其析构函数时,它会错误地delete指针,还是delete[]它?
【问题讨论】:
这样安全吗?
std::unique_ptr<A> ptr(new A[100]);
当ptr超出范围并调用其析构函数时,它会错误地delete指针,还是delete[]它?
【问题讨论】:
您必须正确指定 unique_ptr 将持有的类型才能正常工作:
std::unique_ptr<A[]> ptr(new A[100]);
这将默认为使用delete[] 而不是delete 的删除器。
【讨论】:
如果您正确地将指向的类型指定为A[],它将正确地指定delete[] 指针,因为unique_ptr 的模板专门用于数组类型。
请注意,如果可以自动推断类型,您将不会有机会在这里出错。这将要求产生指针的表达式是一个函数调用(与std::make_pair 相同),如下所示:
auto ptr = make_unique(new A[100]);
这是 C++11 中缺少的有用实用程序,但已添加到 C++14 中。
【讨论】: