大众点评新人抵用券30:C++动态内存问题

来源:百度文库 编辑:中科新闻网 时间:2024/05/12 19:21:19
#include<iostream>
using namespace std;
void main()
{
int *p;
p=new int;
cout<<p<<endl;
cout<<&p<<endl;
*p=5;
cout<<*p<<endl;
delete p;
cout<<p<<endl;
*(p+1)=6;
cout<<*(p+1)<<endl;
*p=5;
cout<<*p<<endl;
}
这里我把p释放了,为什么p还能使用,而且分配到的地址还在,这样的话分配动态内存有什么意义

delete释放p里...p指针本身是不会被释放的...delete操作只是释放p[1]以后的内存(含p[1]本身)...这个过程只仅仅是释放也即标记为可用!,但并没有重置为"只读"或"已锁定"或"只写"等且也不会清0或改变...所以,当还没有其它新增加的变量地址跟p[1]的地址相同时,也就是当p[1]的值未曾改变过时,p[1]所指向的变量还是有效的(p[1]指向的变量本身就应该有效,否则,不管是否delete,程序都会出错!)

简单点说就是, delete后,p的值依然有效! 除非整个程序结束! 而p[1]以后的值,如果没有其它变量覆盖并改变其值或其内存属性的话. 那么,它们依然有效!!!

(注,就算p只是定义在函数内部,p的值依然是有效的,只要你能在函数外部能获取p的实际地址! 当然,如果条件满足上面所说的,p[1]以后的值也会依然有效)

当然能使。

这个内存区被系统标记为可用,但是,还没用。

所以,一般delete后需要把它设成NULL。

我的树经常使我重起。

因为你只设了一个变量,所以没有什么影响.
但是当你设置的变量多了,p释放后就有可能更改已存在的变量,或者引起内存错误。