几行代码,有点不理解,为什么指针 a 在delete后,它所指向的物理地址没变,但是那个地址的值却变了?
正如下列代码所示:#include <iostream>
using namespace std;int main()
{
int *a=new int;
*a=90;
cout << "值为:" << *a << endl;
cout << "地址为:" << a << endl;
delete a;
cout << "值为:" << *a << endl;
cout << "地址为:"  << a << endl;
return 0;
}
可见,指针delete后,指针指向的值变了。但是指针本身的指向没有变。
与我的理解不同,我以前认为,delete后,指针的指向变了(具体指向谁是不确切的),但是原物理地址的内容不会变。
但是通过实验,不是这样,指针的指向没有变,但是它所指向的值变了。
我想问,底层做的什么操作呢?是不是对释放的空间,数据全部清0呢?都变成1或是都变成0.
总之,如何理解呢?

解决方案 »

  1.   

    delete肯定指针值不会变了,但内存已经释放掉了,里面的值已经无效,不管保留原值还是改变,对你而言都没意义了,不能再使用了。要再去使用就是你的不对了
      

  2.   

    同意,对于delete后的指针,是一个不确定的东西,里面的值可能会保留,可能会改变,说简单点,就是这个内存系统已经收回了,它随时可能会用,但是有可能很长一段时间都没有用它。
      

  3.   

    delete 后再加上
    a = NULL;就OK了。
      

  4.   

    因为你的程序是Debug版本的。你编译Release版本的试试。
      

  5.   

    delete之后释放的是指针所指向的内存,不是指针的指向
      

  6.   

    试了,编译release版本还是变了,不是网友说的不变。
    所以说,一定要自已试呀。
      

  7.   


    我是说Debug与Release版的地址是不同的。这里你的原指针指向的内容没有改变是因为你的程序没有做其他操作,导致那块内存没有被程序继续使用,所以内容没有改变。但如果你的程序后面还有其他内存分配的操作,那块内存就有可能被windows指定给其他变量进行操作。内存管理是由windows同样来做的。new的实现里会调用运行时库的malloc,但最终还是会调用到windows的内存管理的API。好的编程习惯是delete完一个指针,要将指针赋NULL,下次使用前判断是否NULL。
      

  8.   

    因为delete 只是释放指针指向的内存空间。