从弱指针返回类型返回共享指针

时间:2019-05-14 22:29:40

标签: c++ c++11

这样做安全吗?为什么我的IDE警告我呢?

std::weak_ptr<SomeClass> getStatus() 
{
    return _mStatus;
}
private:
std::shared_ptr<SomeClass> _mStatus = std::make_shared<SomeClass>();

我的IDE指出:

  

从返回的函数中返回std::shared_ptr<SomeClass>   std::weak_ptr<SomeClass>。类std::shared_ptr<SomeClass>不是   与类std::weak_ptr<SomeClass>

兼容

这安全吗?我应该忽略此警告吗?我在这里某处发生车祸,我认为这可能是原因。

2 个答案:

答案 0 :(得分:3)

您的IDE错误;代码很好。从shared_ptrweak_ptr的隐式转换;从返回类型为shared_ptr的函数返回weak_ptr只会调用转换。我刚刚使用三种不同的编译器(gcc 8.3,msvc 2019,xcode 10)测试了您的代码,它们都进行了转换而没有任何警告。返回weak_ptr是绝对安全的,因为如果原始shared_ptr消失了,它将自动为空,这里没有指针悬空的危险。

该错误消息似乎表明您的编译器认为转换无效;也许您使用的是标准库的旧版本?我不记得是否曾经有过weak_ptr的草稿版本,其中从shared_ptr的转换是显式的或需要函数调用的。

答案 1 :(得分:0)

我的理解是,尽管shared_ptr进行引用计数,但weak_ptr却没有。因此,这是否安全取决于您的使用方式。这样做的风险是,您将weak_ptr返回到_mStatus,然后拥有对象(引用了shared_ptr的对象)消失,导致引用计数为零,因此释放了内存,但您的weak_ptr引用已释放现在它指的是造成混乱的空闲内存。现在,weak_ptr具有一种保护,如果您从中获取值并且已经释放它,它将为您提供一个新初始化的指针(即空指针)。但是,如果您的调用者获取了weak_ptr并从中获取指针值(可能复制到原始指针类型),然后拥有对象消失了,那么该原始指针值将是虚假的。