C++中delete和delete的区别
请问你想问的是不是"delete"与"delete[]"的区别?
两者之间区别的通俗理解是,delete是释放一个单位的堆空间,而delete是删除多个单位堆空间。
比如
int *p1=new int;//释放p1使用delete p1;或者delete[]p1;都是可以的,表示释放1*sizeof(int)个堆空间。
int *p2=new int[10];//如果需要完全释放首地址为p2的堆空间,需要使用delete[]p2;,顺便说一下,delete p2;的结果是p2开始int长度的堆空间被释放,剩下的9*sizeof(int);个堆空间仍然留着。
PS:实际尝试下来(比如VS 2013编译器),针对比如int[],char[]之类的简单数组,delete与delete[]效果完全相同,但是遇到释放class或者struct类型动态空间时候,却会产生不同结果。比如
class test
{
char *c;
public:
test()
{
c=new char[2];
}
~test()
{
delete[]c;//此处使用delete c;也可以。因为c就只有一层堆空间。
}
};
test *p=new test[10];
delete[]p;
//delete p;
这时候delete p与delete[]p会产生不同结果,前者会直接报错。
感觉是delete[]比delete更加“细心”,也就是delete仅仅停留在表面,而delete[]不但会逐个释放第一层t为首的堆空间,而且在释放前还会读取此空间上存放的地址,进入实体类对象的空间,因此会调用类内的析构函数。