码迷,mamicode.com
首页 > 其他好文 > 详细

delete与delete[]

时间:2016-03-03 15:06:29      阅读:168      评论:0      收藏:0      [点我收藏+]

标签:c++   new delete   

    在c++中,在堆上分配内存使用的new函数,它动态分配内存,主要有三种形式:

1.分配一个空间未初始化  int* p=new int;

2.分配一个空间初始化  int* p=new int(初始值)

3.分配一段连续空间   int* p=new int[内存数]

在堆上分配内存使用之后还要手动释放,不然就会发生内存泄露。在c++中对堆上分配的内存释放有两种形式:

delete和delete [],如何选择使用这两个释放的方式?选错了会怎样?

拿一个例子来说明:

#include <iostream>
using namespace std;
class A
{
public:
A()
{
cout<<"A"<<endl;
}
~A()
{
cout<<"~A"<<endl;
}
private:
};
int main(int argc, char const *argv[])
{
A* p=new A[3];
delete[] p;
//  delete p;
return 0;
}

在这个例子中,先看看结果:

  1. 若是用detele[] p;来释放new申请的这段内存,可以成功释放:

    技术分享

  2. 而利用delete p来释放,会出现错误

    技术分享

    而且观察出错点可以发现:delete p 在回收空间的过程中,只有 p[0] 这个对象调用了析构函数,其它对象如 p1[1]、p1[2] 等都没有调用自身的析构函数,因此出现了问题。

经过查阅资料和试验,对于delete和delete[]的区别以及何时使用做一个总结:

   如果用 delete[],则在回收空间之前所有对象都会首先调用自己的析构函数。基本类型的对象没有析构函数,所以回收基本类型组成的数组空间用 delete 和 delete[] 都是应该可以的;但是对于类对象数组,只能用 delete[]。对于 new 的单个对象,只能用 delete 不能用 delete[] 回收空间。 new 分配的单个对象的内存空间的时候用 delete,回收用 new[] 分配的一组对象的内存空间的时候用 delete[]。new 和 delete、new[] 和 delete[] 对应使用。

本文出自 “君峰俊宇” 博客,请务必保留此出处http://10274409.blog.51cto.com/10264409/1747048

delete与delete[]

标签:c++   new delete   

原文地址:http://10274409.blog.51cto.com/10264409/1747048

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!