我对智能指针使用“三规则”有点困惑。如果我有一个只有数据成员是智能指针的类,我是否需要显式定义析构函数,复制构造函数和赋值运算符?智能指针三规则?
我的理解是,因为智能指针会自动处理资源,所以我不需要显式定义析构函数,因此我不需要为三个规则的其他两个。但是,我不确定默认的拷贝构造函数是否足够用于智能指针,如shared_ptr。
谢谢你的帮助!
我对智能指针使用“三规则”有点困惑。如果我有一个只有数据成员是智能指针的类,我是否需要显式定义析构函数,复制构造函数和赋值运算符?智能指针三规则?
我的理解是,因为智能指针会自动处理资源,所以我不需要显式定义析构函数,因此我不需要为三个规则的其他两个。但是,我不确定默认的拷贝构造函数是否足够用于智能指针,如shared_ptr。
谢谢你的帮助!
默认的析构函数是好的,因为shared_ptr
的析构函数将负责解除对象的释放。默认的复制构造函数可能是根据您的用途可以接受:当您复制拥有shared_ptr
的对象时,副本将与原始文件共享所有权。默认赋值运算符自然也是如此。如果这不是你想要的,定义一个拷贝构造函数,否则,例如,克隆引用的对象。
您可能还想覆盖赋值运算符。移动构建/移动分配应该没问题 –
三个规则实际上说:
如果您需要定义下列任何一个不平凡的版本:
- 析构函数
- 赋值运算符
- 拷贝构造函数
...那么你可能还需要另外两个也是。
你似乎是将其解释为:
如果你需要一个不平凡的析构函数,那么你还需要其他两个。
但这不是一回事,是吗?
总之,“不”。将代码分解为单一责任类的重点在于,您可以从“智能”构建模块组成您的类,这样您就不必编写任何代码。
考虑以下几点:
class Foo
{
std::shared_ptr<Bar> m_pbar;
std::string m_id;
};
该类自动具有复制和移动构造函数和复制和移动赋值运算符是好,因为他们可以得到,一切都照顾。
如果你想做到极致,你可以说,在大多数箱子你应该永远不会被写析构函数或根本拷贝构造函数- 如果你这样做,那么也许你应该最好因子该功能成为一个单独的职责,只有一个责任。
EXP0,你最好弄清楚你使用的是什么样的智能指针。它是像std :: auto_ptr,还是更像boost :: shared_ptr <>? – Lev