首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

为什么指针 a 在delete后,那个地址的值却变了?该如何处理

2012-02-09 
为什么指针 a 在delete后,那个地址的值却变了?几行代码,有点不理解,为什么指针 a 在delete后,它所指向的物

为什么指针 a 在delete后,那个地址的值却变了?
几行代码,有点不理解,为什么指针 a 在delete后,它所指向的物理地址没变,但是那个地址的值却变了?
正如下列代码所示:

C/C++ code
#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.
总之,如何理解呢?


[解决办法]
最好在delete a 后让它指向null...
[解决办法]
delete 后只是释放指针所指的内存空间,指针地址没有变,所以delete后 ,为了避免出现野指针,要把指针指向空…建议你去看看林锐的高质量C++编程…
[解决办法]
C++的DELETE只是释放内存,没有清零的操作。
好的编程习惯是,DELETE之后,手动将指针置为NULL。
[解决办法]
内容如下:
delete p;的作用是释放掉p所指向的那块你new出来的内存,这个操作不管是把这块内存上的数据删除,同时也把这块内存释放掉,能让其他的语句使用。
但是内存被释放,指向该内存地址的指针式不会改变的,所以就造成了你输出2次,值虽然变了,但是指针地址没变化。
一般这中操作为了安全起见都会在DELETE之后把指针设置为空,做一个有参宏定义可以简介完成:
#ifndef SAFE_DELETE
#define SAFE_DELET(p) {if(p){ delete (p); (p) = NULLL;};}
#endif
[解决办法]
释放内存不是删掉地址,地址还是原来的地址,只是不受保护了,那段地址很有可能已经被别得函数或者程序改变了所以值不一样
[解决办法]
delete a

是表示消耗 a所指的内存块
但a本身的内容还是保存着这块内存的地址值

消耗a所指的内存后还能用*a访问正常纯属侥幸
[解决办法]
哈哈,你还在up 呢,我试了下,release也变了,

这个问题,

从标准来说,c++标准并没有规定delete之后的值,也就是说delete之后的值,是未定义的

从实现来说,delete的行为是c++运行时库所定义的,也就是说是底层库决定的,如有你有兴趣,可以看看
crt库相关代码,理论上是调用的 heap alloc ,heap free, 如果crt库没有改变delete之后的内存值,那么就和 heap alloc, heap free 的行为相关了,heap alloc和heap free是操作系统api,可以看相关代码来了解这个实现,比如w2k泄漏代码或者微软开源的核心代码。

热点排行