基于"第16项:在new
和delete
"的相应用途中使用相同的表格斯科特迈耶斯'有效的C ++,您不应该在auto_ptr
(或tr1::shared_ptr
)中放置动态分配的数组,因为在销毁时会调用delete p
而不是delete[] p
(另请参阅answers) 。但这仍然适用于C ++ 11<尤其是std::shared_ptr
和std::unique_ptr
更多,因为我在一些开源代码中注意到std::unique_ptr<uint8_t[]>
的使用?如果后者是正确的,那么如何区分new
和new []
分配的数据?
答案 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::array
或std::vector
代替数组上的智能指针。