【发布时间】:2014-09-08 21:39:11
【问题描述】:
我正在编写一个 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 等)和一个空的析构函数。其中一个 cmets 提到 MyClass 需要一个空的析构函数,以便编译器注意到 MyClass::Data 的析构函数。这些真的有必要吗,还是上面的代码足够好?默认的复制/移动构造函数/操作符和析构函数是否足够好?
【问题讨论】:
-
如果你想共享
mData指向的数据,那么你不需要复制构造函数和赋值运算符,默认的就可以了。 -
为什么不使用
std::unique_ptr或std::shared_ptr作为MyClass::Data::ptr成员? -
@KerrekSB 我已经尝试过了,它看起来可以正常工作,但很好验证,因为我以前被这类事情困住了。
-
@RemyLebeau 这只是一个例子,实际的Data类有点复杂,需要一个显式的析构函数。
-
您是否尝试过使用多个翻译单元?
标签: c++ c++11 shared-ptr