簡體   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