1.11.1 enable_shared_from_this

2013-10-07 16:03:24 · 作者: · 浏览: 80

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 的生命期似乎被意外延长了。