如何将shared_ptr返回给拥有它的对象?

时间:2012-08-21 09:18:54

标签: c++ c++11 smart-pointers

这里的类似问题似乎都使用了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 ++中,拥有的对象被破坏。我怎样才能保持活力?

2 个答案:

答案 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();

请注意,您不得更改所有者的代码。

相关问题