Loading

关于delete和delete[]的区别

在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[],基本数据类型两者均可,但最好搭配使用)

posted @ 2016-01-10 21:25  土豆分米猪  阅读(976)  评论(0编辑  收藏  举报