三个智能指针的规则?

时间:2011-09-30 20:08:34

标签: c++

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

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

感谢您的帮助!

3 个答案:

答案 0 :(得分:12)

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

答案 1 :(得分:2)

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

请考虑以下事项:

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

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

如果你想变得极端,你可以说在大多数的情况下,你可能永远不会在所有上编写析构函数或复制构造函数 - 如果你这样做了那么也许你应该把这个功能最好地分解为一个单独的职责。

答案 2 :(得分:1)

三条规则实际上说:

  

如果您需要定义以下任何一项的非平凡版本:

     
      
  1. 析构函数
  2.   
  3. 作业运营商
  4.   
  5. 复制构造函数
  6.         

    ...那么你可能还需要其他两个。

您似乎将其解释为:

  

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

但那不是一回事,是吗?