http://www.btsmth.com/show_snapshot.php?en_name=CPlusPlus&gid=314844
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 (比目鱼) 的大作中提到: 】 : 刚才伪代码写得有些问题,更新了