在C++动态内存分配中我们常用到new和delete两种操作,new用来申请内存,delete用来释放内存。那么问题来了,我们应该用delete来释放内存还是用delete[]来释放内存呢?
为了得到答案我做了一下实验。(注:一下实验在使用delete和delete[]得到的结果是一样的,不重复po图)
在这里,我先为list申请了内存空间,并且指定list[5] = 5;用于后面判断内存是否已经释放,事实证明内存确实释放了,其中存储的5已经被释放,而输出一个奇怪的数字。
但是我觉得不够严谨,于是
我声明一个引用变量a来访问原来list[5]的地址,确保不是list的地址发生变化而导致list[5]的值发生了变化,事实证明内存确实释放了。
然后我发现了一个问题,那就是每次输出的那个奇怪的数字都是一样的,于是我想list[5]的地址是不是也没变?
然后我猜测:delete只是释放了内存里面的东西,而list指向的地址并没有发生变化。
于是我又做了一个实验
我的天,释放内存后居然还能赋值?!我自己都不相信了,于是我打开VS
如图,我设置了三个断点,得到list在三个断点的地址分别为:
+ list 0x004fa2c0 {-842150451} int *
+ list 0x004fa2c0 {-842150451} int *
+ list 0x00008123 {???} int *
也就是说delete以后list实际上也不存在了,这是Dev编译器与VS编译器的差异
最后结论是delete以后内存释放了,指向的地址也变了,不能再对原来的变量赋值。
还有delete和new搭配着用最好,new[]搭配delete[],new搭配delete。(类对象数组一定要用delete[],基本数据类型两者均可,但最好搭配使用)
原文:http://www.cnblogs.com/zhuangshq/p/5119586.html