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

时间:2018-12-06 02:08:25

标签: 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 << 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

1 个答案:

答案 0 :(得分:-1)

与流行的看法相反,指针不仅仅是数字,而且您通过尝试使用悬空的指针来做事情来吸引怪异的行为,而不仅限于取消引用它们。

您对指针值的读取涉及“左值到右值的转换”,标准中对此有一定的要求:

  

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

这意味着您的假设/前提不正确。尽管我们不希望像int这样的好简单变量会自行更改,但是对于所有值类型而言,生活并非如此简单。指针不是数字。它是一个指针。您正在要求计算机告诉您不再存在的对象的地址。根据上面的段落,在这种情况下几乎可以做任何喜欢的事情。

显然,您的编译器已决定利用此规则进行一些优化,并且您最终得到“怪异”的结果(或其delete实现故意修改了其参数以帮助诊断(或。)。 ..(或...(或...))))。

我会说,尽管我从未亲眼目睹这种行为。再说一次,我没有养成观察死指针的习惯。 :)

经验法则:立即将其清空,再也不会再说了。