簡體   English   中英

C ++ std :: shared_ptr通過operator =分配

[英]C++ std::shared_ptr assigning via operator=

我有一些參數化類,其指針私有成員實現為std::shared_ptr 實際上,該指針是指向參數化(模板)結構的指針。 還有一種返回相同指針的方法。 但不包裝在std::shared_ptr 看起來像這樣:

template<typename SomeType> class SomeClass{
    private:
        std::shared_ptr<SomeStruct<SomeType>> ptr;         // pointer
        SomeStruct<SomeType>* someMethod(...);             // method
};

在類的方法中的某個位置,我希望進行以下分配:

ptr = someMethod(..);

這是正確的嗎? 實際上,我希望此方法在需要時分配內存,然后由shared_ptr管理此指針。 我收到一個錯誤,提示找不到正確的operator= 我應該首先在方法中包裝用於重新分配對象的指針嗎?

除了對永不返回原始指針的非常真實的注釋之外,您還有(至少)三個選擇:

  • 返回std::shared_ptr (每次調用都會更新引用計數)
  • 返回對std::shared_ptr的(const)引用(在某些情況下避免引用計數的開銷)
  • std::enable_shared_from_this派生該類。 如果確實需要返回指向該對象的普通指針(或引用),請使用此方法作為最后的選擇。 然后使用ptr = someMethod(...)->shared_from_this();

這是不正確的,並且可能導致兩個獨立的shared_ptr指向同一對象,這將導致雙重刪除:

SomeStruct<SomeType>* raw_ptr = someMethod(..);
ptr p1(raw_ptr);
ptr p2(raw_ptr);

您想要的是enable_shared_from_this 這將與對象一起分配外部引用計數,以便所有構造的共享指針都使用相同的引用計數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM