爲什麼要用 enable_shared_from_this ?

http://www.btsmth.com/show_snapshot.php?en_name=CPlusPlus&gid=314844

 

[合集] 請問boost中的enable_shared_from_this類問題

http://www.btsmth.com/show_snapshot.php?en_name=CPlusPlus&gid=314844
樓主 hma (If you think you can, you can.)
☆─────────────────────────────────────☆
   panrainbow (憂鬱淡藍) 於  (Tue Nov  9 11:48:38 2010)  提到:

引入enable_shared_from_this的原因是可以實現返回值爲指向該類本身的
shared_ptr,爲什麼以this爲拷貝構造函數參數不能完成引用計數的累加,而是用
weak_ptr卻可以呢?
謝謝!


☆─────────────────────────────────────☆
   xiaoman (比目魚) 於  (Tue Nov  9 12:16:25 2010)  提到:

enable_shared_from_this其實是一個簡單的class,其內部包含指向自己的weak_ptr
加上enable_shared_from_this以後,其實是用了多重繼承,
而且這個多重是有成員變量的(不是很好的習慣)

至於你說的問題,不明白“以this爲拷貝構造函數參數不能完成引用計數的累加”

放一個簡單代碼上來看看

【 在 panrainbow (憂鬱淡藍) 的大作中提到: 】
: 引入enable_shared_from_this的原因是可以實現返回值爲指向該類本身的
: shared_ptr,爲什麼以this爲拷貝構造函數參數不能完成引用計數的累加,而是用
: weak_ptr卻可以呢?
: ...................



☆─────────────────────────────────────☆
   panrainbow (憂鬱淡藍) 於  (Tue Nov  9 12:28:13 2010)  提到:

//可以實現引用計數累加
shared_ptr<T> shared_from_this()
{
      shared_ptr<T> p(_internal_weak_this);   //_internal_weak_this is
weak_ptr;
      BOOST_ASSERT(p.get() == this);
        return p;
}

//不能實現引用計數累加
shared_ptr<T> shared_from_this()
{
      shared_ptr<T> p(this);   //this is shared_ptr;
      BOOST_ASSERT(p.get() == this);
        return p;
}
請問這是爲什麼?
【 在 xiaoman (比目魚) 的大作中提到: 】
: enable_shared_from_this其實是一個簡單的class,其內部包含指向自己的
weak_ptr
: 加上enable_shared_from_this以後,其實是用了多重繼承,
: 而且這個多重是有成員變量的(不是很好的習慣)
: ...................



☆─────────────────────────────────────☆
   xiaoman (比目魚) 於  (Tue Nov  9 12:58:41 2010)  提到:

第2種寫法是錯的。這種特性是由shared_ptr的構造函數決定的,
可以這麼理解:
如果shared_ptr通過裸指針T*來構造,那麼代表的是這個shared_ptr<T>完全擁有它,
如果看進去相應的構造函數可以看到會new一個新的計數器結構體,
之後的結果就是對this至少多delete一次
簡單代碼可以這麼描述:
template <typename T> class shared_ptr{
public:
   shared_ptr(T* p):{
 pn = new ref_pn(p); px = p;};
...
private:  T* px; ///raw pointer
ref_pn* pn; /// ref count struct
}

如果用weak_ptr構造,能工作是因爲shared_ptr<T>寫了一個特殊構造函數,
接受從weak_ptr<T>構造自己,
這個特殊構造函數會從weak_ptr<T>裏找到引用計數結構體,並增加計數。
public:
  shared_ptr(weak_ptr<T> pw){
   *pn = *(pw.pn); px = pw.px;
}


【 在 panrainbow (憂鬱淡藍) 的大作中提到: 】
: //可以實現引用計數累加
: shared_ptr<T> shared_from_this()
: {
: ...................



☆─────────────────────────────────────☆
   xiaoman (比目魚) 於  (Tue Nov  9 13:02:41 2010)  提到:

剛纔僞代碼寫得有些問題,更新了

【 在 xiaoman (比目魚) 的大作中提到: 】
: 第2種寫法是錯的。這種特性是由shared_ptr的構造函數決定的,
: 可以這麼理解:
: 如果shared_ptr通過裸指針T*來構造,那麼代表的是這個shared_ptr<T>完全擁有它,
: ...................



☆─────────────────────────────────────☆
   panrainbow (憂鬱淡藍) 於  (Tue Nov  9 13:55:42 2010)  提到:

明白了,謝謝前輩指教
【 在 xiaoman (比目魚) 的大作中提到: 】
: 剛纔僞代碼寫得有些問題,更新了

發佈了237 篇原創文章 · 獲贊 3 · 訪問量 25萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章