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。
- class StockFactory : public boost::enable_shared_from_this<StockFactory>,
- boost::noncopyable
- { /* ... */ };
为了使用shared_from_this(),StockFactory 不能是stack object,必须是heapobject 且由shared_ptr 管理其生命期,即: - shared_ptr<StockFactory> stockFactory(new StockFactory);
万事俱备,可以让this 摇身一变,化为shared_ptr 了。- // version 4
- shared_ptr<Stock> StockFactory::get(const string& key)
- {
- // change
- // pStock.reset(new Stock(key),
- // boost::bind(&StockFactory::deleteStock, this, _1));
- // to
- pStock.reset(new Stock(key),
- boost::bind(&StockFactory::deleteStock,
- shared_from_this(),
- _1));
- // ...
这样一来,boost::function 里保存了一份shared_ptr<StockFactory>,可以保证调用StockFactory::deleteStock 的时候那个StockFactory 对象还活着。
注意一点,shared_from_this() 不能在构造函数里调用,因为在构造StockFactory的时候,它还没有被交给shared_ptr 接管。
最后一个问题,StockFactory 的生命期似乎被意外延长了。