C++ 从弱指针返回类型返回共享指针
这样做安全吗?为什么我的IDE会警告我C++ 从弱指针返回类型返回共享指针,c++,c++11,C++,C++11,这样做安全吗?为什么我的IDE会警告我 std::weak_ptr<SomeClass> getStatus() { return _mStatus; } private: std::shared_ptr<SomeClass> _mStatus = std::make_shared<SomeClass>(); std::弱\u ptr getStatus() { 返回状态; } 私人: std::shared_ptr_mStatus=std::ma
std::weak_ptr<SomeClass> getStatus()
{
return _mStatus;
}
private:
std::shared_ptr<SomeClass> _mStatus = std::make_shared<SomeClass>();
std::弱\u ptr getStatus()
{
返回状态;
}
私人:
std::shared_ptr_mStatus=std::make_shared();
我的IDE声明:
从返回的函数返回std::shared_ptr
std::弱\u ptr
。类std::shared_ptr
不是
与类兼容std::弱\u ptr
这安全吗?我应该忽略这个警告吗?我在这里的某个地方发生了崩溃,我想这可能是一个原因。我的理解是,虽然共享的\u ptr进行引用计数,但弱的\u ptr不进行引用计数。因此,这是否安全取决于您如何使用它。风险在于,您将一个弱\u ptr返回给
\u mStatus
,然后所属对象(具有对它的共享\u ptr引用)消失,导致ref计数为零,因此内存被释放,但对它的弱\u ptr引用现在指的是导致混乱的空闲内存。现在,弱ptr有一个保护,如果您从它那里获得值,并且它已经被释放,它将给您一个新初始化的指针(即空指针)。但是,如果您的调用者获取弱ptr并从中获取指针值(可能复制到原始指针类型),然后拥有的对象消失,那么原始指针值现在是伪造的。您的IDE是错误的;代码很好。有一个从共享的ptr
到弱的ptr
的隐式转换;从返回类型为weak\u ptr
的函数返回shared\u ptr
将只调用转换。我刚刚用三种不同的编译器(gcc 8.3、msvc 2019、xcode 10)测试了您的代码,它们都在没有警告的情况下进行了转换。返回弱\u ptr
是完全安全的,因为如果原始共享\u ptr
消失,它将自动变为null,这里没有指针悬空的危险
错误消息似乎暗示编译器认为转换无效;也许您使用的是非常旧的标准库版本?我不记得是否曾经有过
weak\u ptr
的草案版本,其中从shared\u ptr
的转换是显式的,或者需要函数调用。std::weak\u ptr的全部要点是它不能悬而未决。当拥有的std::shared\u ptr
释放其对象时,所有引用该对象的std::weak\u ptr
都会相应地自动更新。如果不先锁定std::weak_ptr
以获取该对象的新std::shared_ptr
,则无法从std:::weak_ptr
访问对象。您只需在使用该锁之前检查该锁是否返回有效对象。您所说的原始指针是正确的,但使用智能指针(如std::shared_ptr
)的目的是避免首先存储原始指针。@RemyLebeau我以前刚刚使用过boost::shared_ptr,所以在std::shared_ptr方面我可能是错的。无法从弱\u ptr(或共享\u ptr)中获取原始指针值吗?这可能不是预期的模式,但如果发生,可能会导致问题。知道我以前在boost::shared_ptr中遇到过这种情况。“不可能从弱_ptr(或共享_ptr)中获取原始指针值吗?”——从弱_ptr
,不(必须先锁定才能获取共享_ptr
),从共享_ptr
,是(通过共享_ptr::get()
)。