クラスからデストラクタで shared_from_this を呼び出すことは許可されていないことがわかりました。
https://svn.boost.org/trac/boost/ticket/147
この動作は仕様です。デストラクタはオブジェクトを破棄するため、デストラクタが終了するとぶら下がり状態になるため、そのオブジェクトに shared_ptr を作成するのは安全ではありません。
議論は理解できますが、参照をクリーンアップするために「shared_from_this」ポインターが必要な場合はどうでしょうか (所有者シップを共有するためではありません)。
以下は、shared_ptr を使用していない例です。
class A{
public:
A( Manager * m ) : m_(m) {
m_->add(this);
}
~A() {
m_->remove(this);
}
private:
Manager * m_;
};
ここでは、それを共有ポインターに変換しようとしました。しかし、デストラクタを終了する良い方法が見つかりません:
class A : public boost::enable_shared_from_this< A > {
public:
typedef boost::shared_ptr< A > Ptr;
static Ptr create( Manager * m ) {
Ptr p( new A(m));
p->init();
return p;
}
~A() {
// NON-WORKING
// m_->remove( shared_from_this() );
}
private:
A( Manager * m ) : m_(m) { }
void init() {
m_->add(shared_from_this());
}
Manager * m_;
};
上記の例でデストラクタを実装するにはどうすればよいですか?