繁体   English   中英

shared_ptr成员和副本构造函数

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM