首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在智能指针中存储数组类型时,是否明确需要提供删除器?

在智能指针中存储数组类型时,是否明确需要提供删除器?
EN

Stack Overflow用户
提问于 2022-03-09 09:07:48
回答 1查看 54关注 0票数 1

根据本论文的说法,开发人员犯的一个常见错误( #3 )是使用带有数组类型的智能指针;主要是因为操作符delete将被调用,而不是delete[],从而导致程序内存泄漏。

查找C++引用中的默认删除器,下面的代码如下:

代码语言:javascript
复制
#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等)。)?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-03-09 09:35:18

如果我的理解是正确的,你似乎认为示例4与论文相矛盾,论文建议使用示例2,这不是论文所说的。

如本文所述,示例1是未定义的行为:“对数组使用智能指针(如auto_ptr、unique_ptr、shared_ptr )也是不正确的。”

示例2工作正常,但是在本文中根本没有提到使用自定义删除器。

示例3创建指向单个int的指针。这与论文无关。

示例4创建指向int[]的指针,这是本文中提到的一个有效用法:“如果数组需要使用智能指针,则可以使用-- unique_ptr专门化。”

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71406787

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档