设为首页 加入收藏

TOP

1.11.1 enable_shared_from_this
2013-10-07 16:03:24 来源: 作者: 【 】 浏览:72
Tags:1.11.1 enable_shared_from_this

1.11.1 enable_shared_from_this

StockFactory::get() 把原始指针this 保存到了boost::function 中(*** 处),如果StockFactory 的生命期比Stock 短, 那么Stock 析构时去回调StockFactory::deleteStock 就会core dump。似乎我们应该祭出惯用的shared_ptr 大法来解决对象生命期问题,但是StockFactory::get() 本身是个成员函数,如何获得一个指向当前对象的shared_ptr<StockFactory> 对象呢?

有办法,用enable_shared_from_this。这是一个以其派生类为模板类型实参的基类模板14,继承它,this 指针就能变身为shared_ptr。

  1. class StockFactory : public boost::enable_shared_from_this<StockFactory>,  
  2. boost::noncopyable  
  3. { /* ... */ }; 

为了使用shared_from_this(),StockFactory 不能是stack object,必须是heapobject 且由shared_ptr 管理其生命期,即:
  1. shared_ptr<StockFactory> stockFactory(new StockFactory); 

万事俱备,可以让this 摇身一变,化为shared_ptr 了。
  1. // version 4  
  2. shared_ptr<Stock> StockFactory::get(const string& key)  
  3. {  
  4. // change  
  5. // pStock.reset(new Stock(key),  
  6. // boost::bind(&StockFactory::deleteStock, this, _1));  
  7. // to  
  8. pStock.reset(new Stock(key),  
  9. boost::bind(&StockFactory::deleteStock,  
  10. shared_from_this(),  
  11. _1));  
  12. // ... 

这样一来,boost::function 里保存了一份shared_ptr<StockFactory>,可以保证调用StockFactory::deleteStock 的时候那个StockFactory 对象还活着。

注意一点,shared_from_this() 不能在构造函数里调用,因为在构造StockFactory的时候,它还没有被交给shared_ptr 接管。

最后一个问题,StockFactory 的生命期似乎被意外延长了。

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇A.1.3 在什么平台上学习网络编程 下一篇1.11.2 弱回调

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·MySQL 安装及连接-腾 (2025-12-25 06:20:28)
·MySQL的下载、安装、 (2025-12-25 06:20:26)
·MySQL 中文网:探索 (2025-12-25 06:20:23)
·Shell脚本:Linux Sh (2025-12-25 05:50:11)
·VMware虚拟机安装Lin (2025-12-25 05:50:08)