4

クラスからデストラクタで 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_;
};

上記の例でデストラクタを実装するにはどうすればよいですか?

4

3 に答える 3

2

ここでは、それを共有ポインターに変換しようとしました。

しないでください。

最初のクラスは問題ありません (暗黙的に宣言されたコピー コンストラクターとコピー代入であることを除き、生のポインターの使用とは関係ありません)。

なぜスマート ポインターを気にする必要があるのでしょうか。おしゃれだから?

weak_ptrポインタのようなクラスと誤解されることがよくあります(そうではなく、弱参照のことです)。

weak_ptr適切であることはめったにありません。(Boost ドキュメントを使用しても、いつweak_ptrが適切かについて混乱が広がります。)

enable_shared_from_thisさらに誤解されやすい。

于 2011-12-15T02:35:26.997 に答える