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 (比目魚) 的大作中提到: 】
: 剛纔僞代碼寫得有些問題,更新了