我正在编写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的析构函数。这是否真的有必要或上述代码是否足够好?是默认的复制/移动构造函数/运算符和析构函数是否足够好?
答案 0 :(得分:1)
你的代码很好。您可能希望声明一个复制构造函数,以防您想要深度复制数据,但这种方法会破坏使用共享指针的目的。 空的析构函数注释是完整的BS。如果您不提供析构函数,将使用默认值 - 在任何情况下,将始终调用成员类的析构函数。
当你看到人们需要在MyClass.cc中显式默认他们的析构函数(和赋值运算符)时,那是因为他们使用的是std::unique_ptr
而不是std::shared_ptr
。如果切换到使用std::unique_ptr<Data>
,当看不到范围内~Data
的定义时,您将看到编译器提供的析构函数等将barf。但std::shared_ptr
不允许禁止。