[英]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_ptr
和enable_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';
接受指針的函數想要執行以下兩種行為之一:
編輯:哎呀我有點誤讀了這個問題,我現在看到這個答案並沒有完全解決這個問題。 無論如何,我會把它留下來,以防這對任何從事類似代碼工作的人都有幫助。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.