[英]shared_ptr member and copy constructors
我正在编写一个C ++库,希望隐式共享其类之一。 不幸的是,我对其实现有些困惑。 我想使用std::shared_ptr
来存储数据,我想知道下面的代码是否丢失了什么。
// MyClass.h
class MyClass
{
public:
MyClass (void);
private:
class Data;
std::shared_ptr<Data> mData;
};
// MyClass.cc
class MyClass::Data
{
public:
Data (void) { ptr = NULL; }
~Data (void) { delete ptr; }
int* ptr;
};
MyClass::MyClass (void)
: mData (new MyClass::Data())
{
mData->ptr = new int(5);
}
在查看其他人的代码时,我注意到他们添加了复制/移动构造函数/运算符(使用std :: move等)和一个空的析构函数。 其中一条评论提到MyClass需要一个空的析构函数,以便MyClass :: Data的析构函数被编译器注意到。 这真的必要吗?还是上面的代码足够好? 默认的复制/移动构造函数/运算符和析构函数是否足够好?
您的代码很好。 如果您想深度复制数据,则可能需要声明一个复制构造函数,但是这种做法违反了使用共享指针的目的。 空的析构函数注释是完整的BS。 如果不提供析构函数,则将使用默认值-在任何情况下,都将始终调用成员类的析构函数。
当您看到人们需要在MyClass.cc中显式默认其析构函数(和赋值运算符)时,这是因为他们使用的是std::unique_ptr
而不是std::shared_ptr
。 如果您切换到使用std::unique_ptr<Data>
,你会看到编译器提供的析构函数等将BARF当他们无法找到一个定义~Data
范围。 但是std::shared_ptr
不允许驳船。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.