2017-04-04 45 views
1

智能指针“第16项:使用相同的形式和new相应用途delete”斯科特迈尔斯有效的C++,你不应该把动态的auto_ptr(或tr1::shared_ptr)分配数组因为delete p而不是delete[] p被销毁(另请参阅answers)。但是,这仍然适用于C++ 11 <和更多,特别是std::shared_ptrstd::unique_ptr,因为我注意到在一些开源代码中使用了std::unique_ptr<uint8_t[]>?如果后者是正确的,那么如何区分newnew []分配的数据?使用在C++基于动态分配数组

+0

使用'std :: vector'作为数组(可能不是'bool',依赖)。它是C++中标准动态大小的数组。 –

+2

请参阅http://en.cppreference.com/w/cpp/memory/unique_ptr并查看点(2),它是注释 –

回答

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 []

`

2

后者是正确的,unique_ptr与阵列工作正常。它具有调用delete[]的数组类型的模板专门化。不过,Scott Meyers在他的Effective Modern C++中建议使用std::arraystd::vector而不是数组上的智能指针。

+0

他还建议使用'boost :: scoped_array'和'boost :: shared_array';)Can你提供了一个指向数组类型的模板专门化的链接? – Matthias

+2

@Matthias查看Richard Critten的评论,他提供了cppreference的链接。模板实例化在您的libstdC++代码中。 –