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

How to return a shared_ptr of this to the object that owns it?

本文关键字:返回 拥有 对象 ptr shared      更新时间:2023-10-16

这里类似的问题似乎都使用了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++中,所拥有的对象将被销毁。我怎样才能让它活着?

您需要从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++11从中获得enable_shared_from_this)之前,假设您有一个不提供enable_shared_from_thisshared_ptr实现,您可以手动为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()
}

State应继承自std::enable_shared_from_this<State>State::SomeVirtualFunction()应为

return shared_from_this();

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