AKever

导航

C++(1) new && delete、new[] && delete[]

new && delete、new[] && delete[] 

 C++告诉我们在回收用 new 分配的单个对象的内存空间的时候用 delete,回收用 new[]分配的一组对象的内存空间的时候用 delete[]。 关于 new[] 和delete[],其中又分为两种情况:(1) 为基本数据类型分配和回收空间;(2) 为自定义类型分配和回收空间。

#include <iostream>;
using namespace std;
 
class T {
public:
  T() { cout << "constructor" << endl; }
  ~T() { cout << "destructor" << endl; }
};
 
int main()
{
  const int NUM = 3;
 
  T* p1 = new T[NUM];
  cout << hex << p1 << endl;
  //  delete[] p1;
  delete p1;
 
  T* p2 = new T[NUM];
  cout << p2 << endl;
  delete[] p2;
}

大家可以自己运行这个程序,看一看 delete p1 和 delete[] p1 的不同结果,我就不在这里贴运行结果了。

从运行结果中我们可以看出,delete p1 在回收空间的过程中,只有 p1[0] 这个对象调用了析构函数,其它对象如 p1[1]、p1[2] 等都没有调用自身的析构函数,这就是问题的症结所在。如果用delete[],则在回收空间之前所有对象都会首先调用自己的析构函数。 

基本类型的对象没有析构函数,所以回收基本类型组成的数组空间用 delete 和 delete[] 都是应该可以的;但是对于类对象数组,只能用 delete[]。对于 new 的单个对象,只能用 delete 不能用 delete[] 回收空间。 惑,看下面例子:

所以一个简单的使用原则就是:new 和 delete、new[] 和 delete[] 对应使用。

转自:http://www.cnblogs.com/charley_yang/archive/2010/12/08/1899982.html

 

MemTest* mTest1 = new MemTest[10];
MenTest* mTest2 = new MemTest;

int* int1 = new Int[10];
int* int2 = new Int; //int* int2 = new Int(2);

delete[] int1; //-1-
delete[] int2; //-2-

delete[] mTest1; //-3-
delete[] mTest2; //-4-错

在-4-出报错,对内建简单数据类型,delete和delete[]的功能都是相同的。

对于自定义的复制数据类型,delete和delete[]不能互用。delete[]删除一个数组,delete删除一个指针 简单来说。

 

||===============================================||

new\delete和malloc\free的区别

new\delete和malloc\free最大区别是对对象的理解。

malloc与free是C语言的标准库函数,new/delete是C++的运算符。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。

//初始化,那么你将不会调用Foo的构造方法,而只是单纯的分配空间。而且我们只认为你是分配一个空间,而不是想创建一个对象。
Foo* foo = new Foo();
//则会调用Foo的构造方法来初始化对象,也就是说你既要分配空间又要初始化这段空间,让它变成一个对象。
对于delete和free也有同样的问题,就是delete会调用析构函数,free则不会。
Foo* foo = new Foo();

说白了,new\delete玩的是对象,而malloc\free仅仅是内存空间而已

 

对于除去对象意外的其他情况,比如int和float等

int* Array=new int[10];
int* Array=malloc(sizeof(int)*10);

只存在使用技巧的差别,没有本质的差别。

关系:new/delete,其实内部也调用了malloc/free。
共同点: 
1. 都必须配对使用。 
2. 都是申请内存,释放内存。 
3. free和delete可以释放NULL指针。
注意点:
new/delete与malloc/free只能成对使用,不能混合使用。

 

 

posted on 2014-02-08 10:32  AKever  阅读(354)  评论(0)    收藏  举报