首页 文章

三个智能指针的规则?

提问于
浏览
7

通过智能指针使用“三规则”,我有点困惑 . 如果我有一个类,其唯一的数据成员是智能指针,我是否需要显式定义析构函数,复制构造函数和赋值运算符?

我的理解是,由于智能指针将自动处理资源,因此我不需要显式定义析构函数,因此我不需要根据三个规则对其他两个执行此操作 . 但是,我不确定默认的复制构造函数是否足以用于智能指针,例如shared_ptr .

谢谢您的帮助!

3 回答

  • 1

    简而言之,“不” . 将代码分解为单一责任类的重点是,您可以从“智能”构建块中编写类,这样您就不必编写任何代码 .

    考虑以下:

    class Foo
    {
      std::shared_ptr<Bar> m_pbar;
      std::string          m_id;
    };
    

    该类自动具有复制和移动构造函数,并复制和移动赋值运算符,这些运算符尽可能好,并且一切都得到了处理 .

    如果你想变得极端,你可以说在大多数情况下你根本不应该写一个析构函数或复制构造函数 - 如果你这样做,那么也许你最好将这个功能分解为一个单独的责任 .

  • 12

    默认的析构函数很好,因为 shared_ptr 的析构函数将负责对象的释放 . 默认的复制构造函数可能是可接受的,具体取决于您的目的:当您复制拥有 shared_ptr 的对象时,副本将与原始文件共享所有权 . 默认赋值运算符自然也是如此 . 如果那不是你想要的,那么定义一个复制构造函数,否则 - 例如,克隆引用的对象 .

  • 2

    三条规则实际上说:

    如果您需要定义以下任何一个的非平凡版本:析构函数赋值运算符复制构造函数...那么您可能还需要其他两个版本 .

    你好像把它解释为:

    如果你需要一个非平凡的析构函数,那么你还需要另外两个 .

    但那不是一回事,是吗?

相关问题