在C ++中使用智能指针动态分配数组

时间:2017-04-04 12:15:52

标签: c++ c++11

基于&#34;第16项:在newdelete&#34;的相应用途中使用相同的表格斯科特迈耶斯&#39;有效的C ++,您不应该在auto_ptr(或tr1::shared_ptr)中放置动态分配的数组,因为在销毁时会调用delete p而不是delete[] p(另请参阅answers) 。但这仍然适用于C ++ 11&lt;尤其是std::shared_ptrstd::unique_ptr更多,因为我在一些开源代码中注意到std::unique_ptr<uint8_t[]>的使用?如果后者是正确的,那么如何区分newnew []分配的数据?

2 个答案:

答案 0 :(得分:4)

std::unique_ptr专门用于C ++ 11中的数组类型,而不是std::shared_ptr。因此std::unique_ptr<uint8_t[]>会调用delete [],但std::shared_ptr<uint8_t[]>默认会调用delete

虽然在C ++ 17中这种行为已经改变了。在C ++ 17中,std::shared_ptr专门用于数组类型,使用std::shared_ptr<uint8_t[]>将调用delete []

`

答案 1 :(得分:2)

后者是正确的,unique_ptr可以正常使用数组。它具有调用delete[]的数组类型的模板特化。尽管如此,Scott Meyers在他的Effective Modern C ++中建议使用std::arraystd::vector代替数组上的智能指针。