删除指针后,指针保持的地址会发生变化

Dan*_*iel 1 c++ pointers delete-operator

在下面的代码中,为什么指针保持的地址xdelete?之后改变?据我所知,delete调用应该从堆释放已分配的内存,但它不应该更改指针地址.

using namespace std;
#include <iostream>
#include <cstdlib>

int main()
{
    int* x = new int;
    *x = 2;

    cout << x << endl << *x << endl ;

    delete x;

    cout << x << endl;

    system("Pause");
    return 0;
}

OUTPUT:
01103ED8
2
00008123
Run Code Online (Sandbox Code Playgroud)

观察:我使用的是Visual Studio 2013和Windows 8.据说这在其他编译器中不起作用.此外,我理解这是不好的做法,我应该在删除指针后重新指定NULL,我只是想了解是什么驱使这种奇怪的行为.

小智 5

据我所知,deletecall应释放堆中分配的内存,但不应更改指针地址.

好吧,为什么不呢?这是完全合法的输出 - 在删除指针后读取指针会导致未定义的行为.这包括指针的值改变.(事实上​​,这甚至不需要UB; deleted指针可以真正指向任何地方.)