C++--问题7--new/delete 与 malloc/free
1.new 与 malloc的区别
(1)属性:new/delete是关键字,需要编译器支持,效率高于malloc/free,malloc和free是库函数,需要头文件支持。
(2)参数:new申请内存分配时,不需要指定内存块大小,编译器会根据类型信息自行计算,而malloc需要显示指出所需内存大小。
(3)返回类型:new内存分配成功时,返回的是对象类型的指针,类型严格与对象匹配,无需类型转换,故new是类型安全性的操作。而malloc返回的是void*,需要强制转换成我们需要的类型。
(4)重载:C++允许new/delete重载。
(5)自定义类型:new做两件事,先调用operator new函数,申请足够的内存,通常底层用户malloc实现,然后调用类的构造函数,初始化成员变量,返回自定义类型指针。delete是先调用析构函数,然后调用operator delete函数释放内存,底层通常用free实现,malloc和free只能动态申请和释放内存,无法强制要求其做自定义类型对象构造和析构工作。
(6)new内存分配失败时,会抛出bac_alloc异常,malloc分配内存失败时返回NULL。
(7)内存泄漏对于new和malloc都能检测出来,而new可以指出是哪个文件的哪一行,malloc不可以。
(8)内存区域:new操作符是从自由存储区上为对象动态分配内存空间,而malloc函数从堆上动态分配内存。
2.new和delete是如何实现的
(1)new一个对象时:调用malloc为对象分配内存空间 ,调用对象的构造函数 ;
(2)delete时:调用对象的析构函数,调用free回收内存。
3.既然有了malloc/free,C++中为什么还需要new/delete呢?
(1)malloc/free和new/delete都是用来申请内存和回收内存的 ;
(2)在对非基本数据类型的对象使用的时候,对象创建的时候还需要执行构造函数,销毁的时候要执行析构函数。而malloc/free是库函数,是已经编译的代码,所以不能把构造函数和析构函数的功能强加给malloc/free。
4.new/new[]用法
//开辟单地址空间
int *p = new int; //开辟大小为sizeof(int)空间
int *q = new int(5); //开辟大小为sizeof(int)的空间,并初始化为5。
//开辟数组空间
//一维
int *a = new int[100]{0};//开辟大小为100的整型数组空间,并初始化为0。
//二维
int (*a)[6] = new int[5][6];
//三维
int (*a)[5][6] = new int[3][5][6];
5.delete/delete[]用法
//释放单个int空间
int *a = new int;
delete a;
//释放int数组空间
int *b = new int[5];
delete []b;