shared_ptr成员和复制构造函数

时间:2014-09-08 21:39:12

标签: c++ c++11 shared-ptr

我正在编写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的析构函数。这是否真的有必要或上述代码是否足够好?是默认的复制/移动构造函数/运算符和析构函数是否足够好?

1 个答案:

答案 0 :(得分:1)

你的代码很好。您可能希望声明一个复制构造函数,以防您想要深度复制数据,但这种方法会破坏使用共享指针的目的。 空的析构函数注释是完整的BS。如果您不提供析构函数,将使用默认值 - 在任何情况下,将始终调用成员类的析构函数。

当你看到人们需要在MyClass.cc中显式默认他们的析构函数(和赋值运算符)时,那是因为他们使用的是std::unique_ptr而不是std::shared_ptr。如果切换到使用std::unique_ptr<Data>,当看不到范围内~Data的定义时,您将看到编译器提供的析构函数等将barf。但std::shared_ptr不允许禁止。