这里的类似问题似乎都使用了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 ++中,拥有的对象被破坏。我怎样才能保持活力?
答案 0 :(得分:6)
你需要继承std::enable_shared_from_this
;见What is the usefulness of `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 ++ 11得到enable_shared_from_this
的地方),并假设你有一个shared_ptr
实现没有提供enable_shared_from_this
},您可以手动执行此操作,将State
weak_ptr
提供给自己,并在需要时将其转换为shared_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()
}
答案 1 :(得分:0)
State
应该从std::enable_shared_from_this<State>
继承而State::SomeVirtualFunction()
应该是
return shared_from_this();
请注意,您不得更改所有者的代码。