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());

您正在使用指向类型为智能指针的对象的原始指针。但这并不重要你手动分配什么样的对象并保存在 原始指针 - 你必须手动管理该对象的生命周期。或者使用智能指针。