2

ここでの同様の質問はすべて、私が使用していないブーストを使用しているようです。

私がやろうとしていることは、次のように示されています。

「所有者」の場合:

std::shared_ptr<State> m_state;

m_state = make_shared<State>(param);

m_state = m_state->SomeVirtualFunction();    // The original m_state object gets destroyed

「所有」の場合:

std::shared_ptr<State> State::SomeVirtualFunction() {
    return std:shared_ptr<State>(this);
}

MSVS2012のVisualC++では、所有オブジェクトが破棄されます。どうすればそれを生き続けることができますか?

4

2 に答える 2

7

から継承する必要がありstd::enable_shared_from_thisます; `enable_shared_from_this`の有用性は何ですか?を参照してください。。 タイプに、次の代わりに呼び出すstd::enable_shared_from_thisメンバー関数を装備します。shared_from_thisstd::shared_ptr<State>(this)

std::shared_ptr<State> State::SomeVirtualFunction() {
    return shared_from_this();
}

C ++ 11(またはC ++ 11の元となったBoost)より前で、を提供しない実装enable_shared_from_thisがあると仮定すると、を自分自身に与えて、に変換できるようにすることで、これを手動で行うことができます。必要な場合:shared_ptrenable_shared_from_thisStateweak_ptrshared_ptr

class State {
    ...
    std::weak_ptr<State> weak_self;
};

m_state = make_shared<State>(param);
m_state->weak_self = m_state;

std::shared_ptr<State> State::SomeVirtualFunction() {
    return weak_self.lock()
}
于 2012-08-21T09:22:32.450 に答える
1

Stateから継承する必要がありstd::enable_shared_from_this<State>State::SomeVirtualFunction()

return shared_from_this();

所有者のコードを変更してはならないことに注意してください。

于 2012-08-21T09:24:03.563 に答える