您的位置:首页 > 编程语言 > C语言/C++

c++---内存问题---delete p和delete[]p 区别

2017-08-10 09:05 351 查看
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);

}

运行结果

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

class A

{

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相同
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: