C++ 中智能指针的悬挂引用
Dangling reference for smart pointer in C++
我知道在 C++ 中 best/safer 使用智能指针以确保我们不会错过 freeing/deleting 分配的内存。现在我最近在关于 C++ 中的智能指针的讲座中遇到了以下内容。这是示例:
void test_pointer(void)
{
typedef std::shared_ptr<MyObject> MyObjectPtr;
MyObjectPtr p1; // Empty
{
MyObjectPtr p2(new MyObject());
p1 = p2;
}
}
现在我明白了std:shared_ptr
会在最后一次引用完成后被销毁,即我们退出函数后p1
会被销毁。但是最后的警告是关于悬空引用的,这让我很困惑:
MyObjectPtr* pp = new MyObjectPtr(new MyObject());
注释提到如果 this 是在函数内声明的,那么它就是一个悬空引用,这会阻止 std::shared_ptr
被删除。这是为什么?我们正在使用智能指针,所以我们永远不会遇到这种情况?
我刚刚意识到(如果我错了请纠正我):
我们正在使用指向 std::shared_ptr
的原始指针,它永远不会被释放,这就是导致问题的原因。它从未被释放。由于这是在函数中发生的,因此它也可以防止 p1 被破坏。
How come? We are using smart pointers so we should never end up in this situation?
你不是。这里:
MyObjectPtr* pp = new MyObjectPtr(new MyObject());
您正在使用指向类型为智能指针的对象的原始指针。但这并不重要你手动分配什么样的对象并保存在 原始指针 - 你必须手动管理该对象的生命周期。或者使用智能指针。
我知道在 C++ 中 best/safer 使用智能指针以确保我们不会错过 freeing/deleting 分配的内存。现在我最近在关于 C++ 中的智能指针的讲座中遇到了以下内容。这是示例:
void test_pointer(void)
{
typedef std::shared_ptr<MyObject> MyObjectPtr;
MyObjectPtr p1; // Empty
{
MyObjectPtr p2(new MyObject());
p1 = p2;
}
}
现在我明白了std:shared_ptr
会在最后一次引用完成后被销毁,即我们退出函数后p1
会被销毁。但是最后的警告是关于悬空引用的,这让我很困惑:
MyObjectPtr* pp = new MyObjectPtr(new MyObject());
注释提到如果 this 是在函数内声明的,那么它就是一个悬空引用,这会阻止 std::shared_ptr
被删除。这是为什么?我们正在使用智能指针,所以我们永远不会遇到这种情况?
我刚刚意识到(如果我错了请纠正我):
我们正在使用指向 std::shared_ptr
的原始指针,它永远不会被释放,这就是导致问题的原因。它从未被释放。由于这是在函数中发生的,因此它也可以防止 p1 被破坏。
How come? We are using smart pointers so we should never end up in this situation?
你不是。这里:
MyObjectPtr* pp = new MyObjectPtr(new MyObject());
您正在使用指向类型为智能指针的对象的原始指针。但这并不重要你手动分配什么样的对象并保存在 原始指针 - 你必须手动管理该对象的生命周期。或者使用智能指针。