2011-09-30 94 views
5

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

我的理解是,因为智能指针会自动处理资源,所以我不需要显式定义析构函数,因此我不需要为三个规则的其他两个。但是,我不确定默认的拷贝构造函数是否足够用于智能指针,如shared_ptr。

谢谢你的帮助!

+0

EXP0,你最好弄清楚你使用的是什么样的智能指针。它是像std :: auto_ptr,还是更像boost :: shared_ptr <>? – Lev

回答

10

默认的析构函数是好的,因为shared_ptr的析构函数将负责解除对象的释放。默认的复制构造函数可能是根据您的用途可以接受:当您复制拥有shared_ptr的对象时,副本将与原始文件共享所有权。默认赋值运算符自然也是如此。如果这不是你想要的,定义一个拷贝构造函数,否则,例如,克隆引用的对象。

+1

您可能还想覆盖赋值运算符。移动构建/移动分配应该没问题 –

1

三个规则实际上说:

如果您需要定义下列任何一个不平凡的版本:

  1. 析构函数
  2. 赋值运算符
  3. 拷贝构造函数

...那么你可能还需要另外两个也是。

你似乎是将其解释为:

如果你需要一个不平凡的析构函数,那么你还需要其他两个。

但这不是一回事,是吗?

2

总之,“不”。将代码分解为单一责任类的重点在于,您可以从“智能”构建模块组成您的类,这样您就不必编写任何代码。

考虑以下几点:

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

该类自动具有复制和移动构造函数和复制和移动赋值运算符是好,因为他们可以得到,一切都照顾。

如果你想做到极致,你可以说,在大多数箱子你应该永远不会被写析构函数或根本拷贝构造函数- 如果你这样做,那么也许你应该最好因子该功能成为一个单独的职责,只有一个责任。