问题描述
有人能解释为什么我在程序结束后收到这个错误吗?
free(): 无效指针
这是我的代码:
#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
的全部和全部目的,它存在的唯一原因,是当它超出范围并被销毁时,它会自动 delete
是它指向的任何东西(假设它已经'没有被移出)。
a
是在函数局部作用域中实例化的,而不是动态作用域,因此尝试 delete
未new
的内容会导致未定义的行为和崩溃。>
这是一个独特指针的玩具模型:
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
删除它会调用未定义的行为。
unique_ptr
不是 toy_ptr
,但它也拥有传递给构造函数的指针的所有权,并尝试在其析构函数中删除它。