为什么我得到 free(): invalid pointer error after program ends

why am I getting free(): invalid pointer error after program ends

有人可以解释为什么我在程序结束后收到此错误吗?

free(): invalid pointer

这是我的代码:

#include <iostream>
#include <memory>

int main()
{
    int a = 3;
    std::unique_ptr<int> up(&a);
    
    std::cout << a << std::endl;
    std::cout << *up << std::endl;
    
    std::cout << &a << std::endl;
    std::cout << up.get() << std::endl;
    
    return 0;
}
std::unique_ptr<int> up(&a);

std::unique_ptr 的全部和全部目的,它存在的唯一原因,就是当它超出范围并被自动销毁时 deletes 无论它指向什么(假设它没有被移动。

a 是在函数局部范围而非动态范围内实例化的,因此尝试 deletenew 的内容会导致未定义的行为和崩溃。

这是一个独特指针的玩具模型:

struct toy_ptr {
    int* p;
    ~toy_ptr() { delete p; }
};

(“玩具”因为需要更多,而这只是重现问题所需要的)

现在如果你这样做:

int main() {

    int a = 0;
    toy_ptr ptr{&a};
}

toy_ptr 取得了 a 的所有权。拥有一个对象意味着:toy_ptr 负责在其析构函数中删除它。 a 未通过 new 分配,因此尝试通过 delete &a 删除它会调用未定义的行为。

A unique_ptr 不是 toy_ptr,但它也确实拥有传递给构造函数的指针的所有权,并且它确实尝试在其析构函数中删除它。