Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从弱指针返回类型返回共享指针_C++_C++11 - Fatal编程技术网

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

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

这样做安全吗?为什么我的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::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()
)。