简单区别
共性
delete仅删除指针指向的地址的空间,并不删除指针的原有空间
对于基础类型
1、delete可以正确的释放new出来的内存空间;
2、delete[]删除一个常规数组时与delete作用一样仅能删除首元素;
对于对象数组类型
1、delete仅能删除首元素,删除对象数组时,delete仅调用数组首对象析构函数,剩余对象空间无法
被释放,delete[]则可以释放指针指向的全部空间;
源代码
#include<iostream>
using namespace std;
#define ARRAY_SIZE 6
class Test
{
public:
Test(int m = 20) { member = m;}
~Test() {cout<<"Delete object."<<endl;}
void setVal(int num) {member = num;}
void show() {cout<<"num=: "<<member<<endl;}
private:
int member;
};
// 1、delete仅删除指针指向的地址的空间,并不删除指针的原有空间
void ordinaryDelete();
/* 2、delete[]删除一个常规数组时与delete作用一样,仅能删除首元素,删除对象数组时,
delete仅调用数组首对象析构函数,剩余对象空间无法被释放,delete[]则可以释放指针指
向的全部空间*/
void objDelete();
int main()
{
ordinaryDelete();
objDelete();
return 0;
}
void ordinaryDelete()
{
cout<<"Before\n";
int *pInt = new int;
*pInt = 10;
cout<<*pInt<<'\n';
delete pInt;
cout<<"Test again"<<endl;
pInt =new int;
*pInt = 666;
cout<<*pInt<<endl;
delete pInt;
}
void objDelete()
{
// 普通类型
double *Parr = new double[ARRAY_SIZE](); //初始化每个值为0
for (int i = 0; i < ARRAY_SIZE; i++) {
Parr[i] += 3.14;
cout<<"Parr "<<i<<" is: "<<Parr[i]<<"\t";
}
cout<<endl;
cout<<"普通类型delete"<<endl;
#if 0
// delete Parr;
#endif
#if 1
delete [] Parr; // 两者效果一样,仅能删除首元素
#endif
for (int j = 0; j < ARRAY_SIZE; j++) {
cout<<"Parr "<<j<<" is: "<<Parr[j]<<"\t";
}
cout<<endl;
// 对象类型
cout<<"对象类型"<<endl;
Test *Pobj = new Test[ARRAY_SIZE];
for (int i = 0; i < ARRAY_SIZE; i++) {
cout<<"objInit "<<i<<" is: ";
Pobj[i].setVal(1000);
Pobj[i].show();
}
cout<<"对象类型delete"<<endl;
#if 1
delete Pobj; // delete仅调用数组首对象的析够函数
#endif
#if 0
delete[] Pobj; // delete[]正确删除对象数组中每个成员的对象空间
#endif
}