C++ 为什么悬空指针指向不同的内存地址

C++ 为什么悬空指针指向不同的内存地址,c++,C++,释放内存后,我希望指针指向被释放的内存。但它指向了一些不同的地址。为什么会这样 #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 <<

释放内存后,我希望指针指向被释放的内存。但它指向了一些不同的地址。为什么会这样

#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;
}
#包括
#包括
使用名称空间std;
int main(){
int*p=新的int(4);

与流行的观点相反,指针不仅仅是数字,你试图用一个悬空的指针来做事情,而不仅仅是去引用它们,这会引起奇怪的行为

您读取指针的值涉及到“从左值到右值的转换”,标准对您的滑稽动作有如下说明:

否则,如果glvalue引用的对象包含无效的指针值([basic.stc.dynamic.deallocation]、[basic.stc.dynamic.safety]),则行为是实现定义的。[])

这意味着你的假设/前提是不正确的。虽然我们不希望像
int
s这样简单的变量会自行改变,但对于所有的值类型来说,生活并不是那么简单。指针不是数字,而是指针。你要求你的计算机告诉你一个不再存在的对象的地址。根据本文如上所述,在这些条件下,它几乎可以做任何它想做的事情

显然,您的编译器已决定利用此规则应用一些优化,结果是“奇怪的”(或其
delete
实现故意修改其参数以帮助诊断(或…(或…(或…))

不过我要说的是,我从未亲眼目睹过这种行为。再说一次,我没有养成观察死角的习惯。:)


经验法则:立即将其删除,不再提及。

评论不用于扩展讨论;此对话已被删除。