void test()
{
char*p1 = NULL;
char*p2 = NULL;
p1 = new char;
printf("p1 = %p\n",p1);
delete p1;
printf("p1 = %p\n",p1);
p2 = new char;
printf("p2 = %p\n",p2);
}
class AA
{
public:
AA(){printf("aa\n");}
~AA(){printf("~aa\n");}
private:
int a;
};
void test3()
{
AA *p = NULL;
p = new AA[10];
// eroor delete p;
delete []p;
}
void test2()
{
char *p = new char[10];
//delete p; //right
delete []p;
}
{
private:
int i;
string s;
public:
~A(){printf("~a\n");}
};
void d(A* p)
{
delete []p;
//delete p; //error
}
void test1()
{
A *p = new A[10];
d(p);
}
int main()
{
test();
return 0;
{
char*p1 = NULL;
char*p2 = NULL;
p1 = new char;
printf("p1 = %p\n",p1);
delete p1;
printf("p1 = %p\n",p1);
p2 = new char;
printf("p2 = %p\n",p2);
}
运行结果
p1 = 0x82f7008
p1 = 0x82f7008
p2 = 0x82f7008
分析
地址没有变化
class AA
{
public:
AA(){printf("aa\n");}
~AA(){printf("~aa\n");}
private:
int a;
};
void test3()
{
AA *p = NULL;
p = new AA[10];
// eroor delete p;
delete []p;
}
void test2()
{
char *p = new char[10];
//delete p; //right
delete []p;
}
运行结果
aa
aa
aa
aa
aa
aa
aa
aa
aa
aa
~aa
~aa
~aa
~aa
~aa
~aa
~aa
~aa
~aa
~aa
{
private:
int i;
string s;
public:
~A(){printf("~a\n");}
};
void d(A* p)
{
delete []p;
//delete p; //error
}
void test1()
{
A *p = new A[10];
d(p);
}
int main()
{
test();
return 0;
}
结论
基本类型的对象没有析构函数,所以回收基本类型组成的数组空间用 delete 和 delete[] 都是应该可以的;
但是对于类对象数组,只能用 delete[]。
对于 new 的单个对象,只能用 delete 不能用 delete[] 回收空间。
delete []objects; // 正确的用法
delete objects; // 错误的用法
后者相当于delete objects[0],漏掉了另外99 个对象
严格应该这样说:后者相当于仅调用了objects[0]的析构函数,漏掉了调用另外99 个对象的析构函数,并且在调用之后释放内存时导致异常
(如果存在析构函数的话),如果对象无析构函数该语句与delete []objects相同