簡體   English   中英

為此獲得boost :: shared_ptr

[英]Getting a boost::shared_ptr for this

我在我的代碼中廣泛使用boost:shared_ptr 實際上,堆上分配的大多數對象都由shared_ptr持有。 不幸的是,這意味着我無法通過this成需要的任何功能shared_ptr 考慮以下代碼:

void bar(boost::shared_ptr<Foo> pFoo)
{
    ...
}

void Foo::someFunction()
{
    bar(this);
}

這里有兩個問題。 首先,這不會編譯,因為shared_ptr的T *構造函數是顯式的。 其次,如果我強制它用bar(boost::shared_ptr<Foo>(this))構建bar(boost::shared_ptr<Foo>(this))我將創建第二個指向我的對象的共享指針,最終將導致雙刪除。

這讓我想到了一個問題:是否有任何標准模式可以從其中一個對象的方法中獲取您知道的現有共享指針的副本? 使用侵入式引用計數是我唯一的選擇嗎?

您可以從enable_shared_from_this派生,然后您可以使用“ shared_from_this ()”而不是“this”來生成指向您自己的自身對象的共享指針。

鏈接示例:

#include <boost/enable_shared_from_this.hpp>

class Y: public boost::enable_shared_from_this<Y>
{
public:

    shared_ptr<Y> f()
    {
        return shared_from_this();
    }
}

int main()
{
    shared_ptr<Y> p(new Y);
    shared_ptr<Y> q = p->f();
    assert(p == q);
    assert(!(p < q || q < p)); // p and q must share ownership
}

從成員函數生成線程到boost :: bind到shared_from_this()而不是這個時,這是一個好主意。 它將確保不釋放對象。

只需使用函數參數的原始指針而不是shared_ptr。 智能指針的目的是控制對象的生命周期,但C ++作用域規則已經保證了對象的生命周期:它至少與函數結束一樣長。 也就是說,調用代碼不能在函數返回之前刪除對象; 因此,只要您不嘗試刪除函數內的對象,就可以保證“啞”指針的安全性。

您需要將shared_ptr傳遞給函數的唯一時間是您希望將對象的所有權傳遞給函數,或者希望函數復制指針。

boost有這個用例的解決方案,請檢查enable_shared_from_this

你真的在酒吧內制作更多pFoo的共享副本嗎? 如果你內心沒有做任何瘋狂的事情,那就這樣做:


void bar(Foo &foo)
{
    // ...
}

使用C ++ 11 shared_ptrenable_shared_from_this現在位於標准庫中。 顧名思義,后者正好適用於這種情況。

http://en.cppreference.com/w/cpp/memory/shared_ptr

http://en.cppreference.com/w/cpp/memory/enable_shared_from_this

示例基於以上鏈接中的示例:

struct Good: std::enable_shared_from_this<Good>{
    std::shared_ptr<Good> getptr() {
        return shared_from_this();
    }
};

使用:

std::shared_ptr<Good> gp1(new Good);
std::shared_ptr<Good> gp2 = gp1->getptr();
std::cout << "gp2.use_count() = " << gp2.use_count() << '\n';

接受指針的函數想要執行以下兩種行為之一:

  • 擁有傳入的對象 ,並在超出范圍時將其刪除。 在這種情況下,您可以只接受X *並立即將scoped_ptr包裝在該對象周圍(在函數體中)。 這將接受“this”或者通常是任何堆分配的對象。
  • 分享指針 (不擁有它)在傳遞的對象。在這種情況下,你希望使用scoped_ptr的所有,因為你不希望你的函數結束時刪除對象。 在這種情況下,你理論上想要的是shared_ptr(我在其他地方看到它被稱為linked_ptr)。 boost庫有一個shared_ptr版本 ,這也是Scott Meyers的Effective C ++書籍(第3版第18項)中的推薦。

編輯:哎呀我有點誤讀了這個問題,我現在看到這個答案並沒有完全解決這個問題。 無論如何,我會把它留下來,以防這對任何從事類似代碼工作的人都有幫助。

暫無
暫無

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

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