释放内存后,我希望指针指向已释放的内存。但这指向其他地址。为什么这样?
#include <iostream>
#include <string>
using namespace std;
int main() {
int* p = new int(4);
cout << p << endl; //address here is xxx
delete p;
cout << p << endl; //I expect it to be same xxx, but it is yyy
p = nullptr;
cout << p << endl; //no question here
system("pause");
return 0;
}
那么,yyy
内存位置到底意味着什么,为什么它不是xxx
?
答案 0 :(得分:-1)
与流行的看法相反,指针不仅仅是数字,而且您通过尝试使用悬空的指针来做事情来吸引怪异的行为,而不仅限于取消引用它们。
您对指针值的读取涉及“左值到右值的转换”,标准中对此有一定的要求:
否则,如果glvalue引用的对象包含无效的指针值([basic.stc.dynamic.deallocation],[basic.stc.dynamic.safety]),则行为是实现定义的。 [7.3.1/3])
这意味着您的假设/前提不正确。尽管我们不希望像int
这样的好简单变量会自行更改,但是对于所有值类型而言,生活并非如此简单。指针不是数字。它是一个指针。您正在要求计算机告诉您不再存在的对象的地址。根据上面的段落,在这种情况下几乎可以做任何喜欢的事情。
显然,您的编译器已决定利用此规则进行一些优化,并且您最终得到“怪异”的结果(或其delete
实现故意修改了其参数以帮助诊断(或。)。 ..(或...(或...))))。
我会说,尽管我从未亲眼目睹这种行为。再说一次,我没有养成观察死指针的习惯。 :)
经验法则:立即将其清空,再也不会再说了。