C++中智能指针的悬空引用 我明白,在C++中,使用智能指针是最好的/更安全的,以确保我们永远不会错过释放/删除分配的内存。最近我在一篇关于C++中智能指针的讲座中遇到了以下问题。例如: 无效测试 { typedef std::共享_ptr MyObjectPtr; MyObjectPtr p1;//为空 { 肌体PTR p2新肌体; p1=p2; } }

C++中智能指针的悬空引用 我明白,在C++中,使用智能指针是最好的/更安全的,以确保我们永远不会错过释放/删除分配的内存。最近我在一篇关于C++中智能指针的讲座中遇到了以下问题。例如: 无效测试 { typedef std::共享_ptr MyObjectPtr; MyObjectPtr p1;//为空 { 肌体PTR p2新肌体; p1=p2; } },c++,shared-ptr,smart-pointers,C++,Shared Ptr,Smart Pointers,现在我知道std:shared_ptr在最后一次引用完成后将被销毁,即退出函数p1后将被销毁。但最后的警告是关于一个悬而未决的参考,这让我很困惑: MyObjectPtr*pp=新的MyObjectPtrnew MyObject; 注意事项提到,如果这是在函数中声明的,那么它是一个悬空引用,这将防止std::shared_ptr被删除。为什么呢?我们使用的是智能指针,因此永远不会出现这种情况?我刚刚意识到这一点,如果我错了,请纠正我: 我们使用的是一个指向std::shared_ptr的原始指针

现在我知道std:shared_ptr在最后一次引用完成后将被销毁,即退出函数p1后将被销毁。但最后的警告是关于一个悬而未决的参考,这让我很困惑:

MyObjectPtr*pp=新的MyObjectPtrnew MyObject;
注意事项提到,如果这是在函数中声明的,那么它是一个悬空引用,这将防止std::shared_ptr被删除。为什么呢?我们使用的是智能指针,因此永远不会出现这种情况?

我刚刚意识到这一点,如果我错了,请纠正我:


我们使用的是一个指向std::shared_ptr的原始指针,它永远不会被释放,这正是导致问题的原因。它从未被释放。由于函数中发生了这种情况,因此它也可以防止p1被破坏。

我刚刚意识到了这一点,如果我错了,请纠正我:

我们使用的是一个指向std::shared_ptr的原始指针,它永远不会被释放,这正是导致问题的原因。它从未被释放。由于这是在函数中发生的,因此它也可以防止p1被破坏

为什么?我们正在使用智能指针,所以我们永远不应该在这种情况下结束

你不是。在这里:

MyObjectPtr* pp = new MyObjectPtr(new MyObject());
您正在使用原始指针指向类型为智能指针的对象。但是,手动分配什么类型的对象并将其保留在原始指针中并不重要——您必须手动管理该对象的生存期。或者使用智能指针

为什么?我们正在使用智能指针,所以我们永远不应该在这种情况下结束

你不是。在这里:

MyObjectPtr* pp = new MyObjectPtr(new MyObject());

您正在使用原始指针指向类型为智能指针的对象。但是,手动分配什么类型的对象并将其保留在原始指针中并不重要——您必须手动管理该对象的生存期。或者使用智能指针。

一个手动管理指针到智能指针的健全性是你应该考虑的一个巨大的代码气味。手动管理指针到智能指针的合理性是你应该考虑的巨大代码气味。是的,就是这样。没错。