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只能成对使用,不能混合使用。
浙公网安备 33010602011771号