这样做安全吗?为什么我的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>
这安全吗?我应该忽略此警告吗?我在这里某处发生车祸,我认为这可能是原因。
答案 0 :(得分:3)
您的IDE错误;代码很好。从shared_ptr
到weak_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并从中获取指针值(可能复制到原始指针类型),然后拥有对象消失了,那么该原始指针值将是虚假的。