2

这里的类似问题似乎都使用了boost,我没有使用。

我正在尝试做的事情如下所示:

在“所有者”中:

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);
}

在 MSVS 2012 的 Visual C++ 中,拥有的对象被销毁。我怎样才能让它活着?

4

2 回答 2

7

您需要继承自std::enable_shared_from_this; 看看`enable_shared_from_this` 有什么用处?. std::enable_shared_from_this为您的类型配备shared_from_this您调用的成员函数,而不是std::shared_ptr<State>(this)

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

在 C++11(或 Boost,这是 C++11enable_shared_from_this的来源)之前,假设您有一个shared_ptr不提供的实现,您可以通过将a给它自己来enable_shared_from_this手动执行此操作,它可以转换为当它需要时:Stateweak_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 回答