几行代码,有点不理解,为什么指针 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.
总之,如何理解呢?
正如下列代码所示:#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.
总之,如何理解呢?
a = NULL;就OK了。
所以说,一定要自已试呀。
我是说Debug与Release版的地址是不同的。这里你的原指针指向的内容没有改变是因为你的程序没有做其他操作,导致那块内存没有被程序继续使用,所以内容没有改变。但如果你的程序后面还有其他内存分配的操作,那块内存就有可能被windows指定给其他变量进行操作。内存管理是由windows同样来做的。new的实现里会调用运行时库的malloc,但最终还是会调用到windows的内存管理的API。好的编程习惯是delete完一个指针,要将指针赋NULL,下次使用前判断是否NULL。