带有数组指针的std :: unique_ptr

时间:2014-03-31 08:56:54

标签: c++ pointers stl

这样安全吗?

std::unique_ptr<A> ptr(new A[100]);

ptr超出范围并且其析构函数被调用时,它会错误地delete指针,还是delete[]它?

2 个答案:

答案 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中。