这样安全吗?
std::unique_ptr<A> ptr(new A[100]);
当ptr
超出范围并且其析构函数被调用时,它会错误地delete
指针,还是delete[]
它?
答案 0 :(得分:4)
您必须正确指定unique_ptr
将要保持的类型才能使其正常工作:
std::unique_ptr<A[]> ptr(new A[100]);
这将默认为使用delete[]
而非delete
的删除者。
答案 1 :(得分:2)
如果您正确地将指向类型指定为A[]
,它将正确delete[]
指针,因为对于数组类型存在unique_ptr
的模板特化。
请注意,如果可以自动推断出类型,那么您将没有机会在这里出错。这将需要生成指针的表达式为函数调用(与std::make_pair
相同),如下所示:
auto ptr = make_unique(new A[100]);
这是C ++ 11中缺少的有用实用程序,但它已被添加到C ++ 14中。