malloc与new的区别
1.属性
new/delete是C++关键字,需要编译器支持 malloc free是库函数,需要头文件
2.自定义类型
new会先调用operate new()函数,申请足够的内存空间(malloc实现),然后调用类型的构造函数,初始化成员变量,最后返回自定义类型指针(也就是类指针)。
delete则先调用析构函数,然后调用operate delete()函数释放内存(free);
注意:new[] delete[]提供了对数组批量处理的支持,表现在它会分别调用构造函数函数初始化每一个数组元素(这里的每一个元素都代表着对象),释放对象时为每个对象调用析构函数。
malloc/free只是库函数,无法满足我们对自定义类型做构造和析构。
3.申请的位置
malloc申请的内存是堆上的空间 堆是操作系统术语,是操作系统维护的一块特殊内存
new申请的内存是自由存储区的空间 自由存储区是C++基于new操作符的一个抽象概念
4.返回类型
malloc内存分配成功返回void* 程序员用强制类型转换得到我们需要的类型 分配失败时返回NULL
new操作符内存分配成功时返回对象类型的地址,类型严格与对象匹配,无需强转 分配失败时抛出bac_alloc异常
5.指定大小
malloc分配内存空间需要程序员显示的表明需要多大的空间
new会得到编译器的帮助,根据类型信息自动计算所需空间
6.重载
C++允许重载new/delete运算符,比如布局new就不需要为对象分配内存,而是指定一个地址作为起始区域,new在这段空间上完成初始化工作,并返回地址。
malloc没有这个功能。
7.扩展性
malloc分配内存之后,可以使用relloc重新调整大小,而new没有这个功能