在C++中呢,用new申请的内存空间,它的释放方式有 delete 和 delete[] 两种方式,那么这两种方式到底有什么区别呢?今天我们就谈一下:
前几天呢,我在书上看见过这样的内容:
delete 释放new分配的单个对象指针指向的内存
delete[] 释放new分配的对象数组指针指向的内存
对于这两句话的理解,我们来分析一下底下的代码,就知道了。
int *p=new int [10];
- delete p;
- delete [ ]p;
对于这两种方式,应该有一些人会认为第一种方式会导致内存泄漏。(这种情况会出现吗?) 答案是不会的。原因就是:
1>.对于简单类型而言:使用new分配后的不管是数组还是非数组形式内存空间用这两种方式释放都是可以的。如:
int *p=new int [10];
- delete p;
- delete [ ]p;
此种情况下的这两种释放效果是相同的,并不会产生内存泄漏,主要原因在于:当我们进行分配简单类型内存时,我们分配的内存大小就已经确定了,这样系统可以记忆并且进行管理,在析构时,系统并不会调用析构函数, 而它是直接通过指针可以获取实际分配的内存空间。
2>.针对类Class,这两种方式体现出了具体差异 ,当你通过下列方式分配一个类对象数组:
class Budle
{
public:
A(){ mc_namek = new char[length]; }
~A() { delete []mc_namek; }
private:
char *mc_namek;
int length;
};
int main()
{
Budle *str = new Budle[10];
delete str;
}
以上代码中可以得到:delete str; //仅仅释放了str指针指向的全部内存空间 但是只调用了str[0]对象的析构函数 剩下的从str[1]到str[9]这9个用户自行分配的mc_namek对应内存空间将不能释放 从而造成内存泄漏。
delete [] str; //调用使用类对象的析构函数释放用户自己分配内存空间并且释放了a指针指向的全部内存空间。
所以总结一下就是,如果str代表的是一个用new申请的内存返回的内存空间地址,即所谓的指针,那么:
对于像int/char/long/int*/struct等等简单数据类型,由于对象没有析构函数,所以用delete 和delete [] 是一样的!但是如果是C++对象数组就不同了!!!
delete str 代表用来释放内存,且只用来释放str指向的内存。容易造成内存泄漏!!
delete[ ] str 用来释放str指向的内存,!!还逐一调用数组中每个对象的析构函数!!
以上就是我所总结的delete和delete[ ]的区别。如有错误请各位同仁进行指正。