根据本论文的说法,开发人员犯的一个常见错误( #3 )是使用带有数组类型的智能指针;主要是因为操作符delete将被调用,而不是delete[],从而导致程序内存泄漏。
查找C++引用中的默认删除器,下面的代码如下:
#include <memory>
#include <vector>
#include <algorithm>
int main()
{
// {
// std::shared_ptr<int> shared_bad(new int[10]);
// } // the destructor calls delete, undefined behavior
{
std::shared_ptr<int> shared_good(new int[10], std::default_delete<int[]>());
} // the destructor calls delete[], ok
{
std::unique_ptr<int> ptr(new int(5));
} // unique_ptr<int> uses default_delete<int>
{
std::unique_ptr<int[]> ptr(new int[10]);
} // unique_ptr<int[]> uses default_delete<int[]>
// default_delete can be used anywhere a delete functor is needed
std::vector<int*> v;
for(int n = 0; n < 100; ++n)
v.push_back(new int(n));
std::for_each(v.begin(), v.end(), std::default_delete<int>());
}这直接与此相矛盾;但这可能是由于不同的C++标准;是这种情况,还是文章中的第三种说法根本不正确?
当使用带有智能指针的数组时,是否需要显式地提供删除器,还是取决于c++标准(例如,C++11或c++17中的不同行为;c++20 );或者平台(例如gcc、MSVC等)。)?
发布于 2022-03-09 09:35:18
如果我的理解是正确的,你似乎认为示例4与论文相矛盾,论文建议使用示例2,这不是论文所说的。
如本文所述,示例1是未定义的行为:“对数组使用智能指针(如auto_ptr、unique_ptr、shared_ptr )也是不正确的。”
示例2工作正常,但是在本文中根本没有提到使用自定义删除器。
示例3创建指向单个int的指针。这与论文无关。
示例4创建指向int[]的指针,这是本文中提到的一个有效用法:“如果数组需要使用智能指针,则可以使用-- unique_ptr专门化。”
https://stackoverflow.com/questions/71406787
复制相似问题