为什么我得到 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
的全部和全部目的,它存在的唯一原因,就是当它超出范围并被自动销毁时 delete
s 无论它指向什么(假设它没有被移动。
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
删除它会调用未定义的行为。
A unique_ptr
不是 toy_ptr
,但它也确实拥有传递给构造函数的指针的所有权,并且它确实尝试在其析构函数中删除它。
有人可以解释为什么我在程序结束后收到此错误吗?
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
的全部和全部目的,它存在的唯一原因,就是当它超出范围并被自动销毁时 delete
s 无论它指向什么(假设它没有被移动。
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
删除它会调用未定义的行为。
A unique_ptr
不是 toy_ptr
,但它也确实拥有传递给构造函数的指针的所有权,并且它确实尝试在其析构函数中删除它。