【问题标题】:Why dangling pointer points to different memory address [duplicate]为什么悬空指针指向不同的内存地址[重复]
【发布时间】:2018-12-06 02:08:25
【问题描述】:

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

#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

【问题讨论】:

标签: c++


【解决方案1】:

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

您对指针值的读取涉及“左值到右值的转换”,标准对您的滑稽动作有这样的说法:

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

这意味着您的假设/前提不正确。尽管我们不希望像ints 这样简单的变量会自行改变,但对于所有值类型来说,生活并不是那么简单。指针不是数字;它是一个指针。你要求你的计算机告诉你一个不再存在的对象的地址。根据上面的段落,在这种情况下,它几乎可以为所欲为。

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

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

经验法则:立即将其取消,不再提及。

【讨论】:

    猜你喜欢
    • 2016-02-08
    • 1970-01-01
    • 1970-01-01
    • 2020-12-30
    • 2019-05-10
    • 2019-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多