malloc、new对象不同区别
malloc/free是C的库函数,new/delete是C++的运算符,都用于动态申请内存和释放内存;
第二,对于非内部数据类型的对象,对象在创建时要自动构造,销毁前要自动析构,这种情况只能用new/delete,因为malloc/free是库函数,不在编译器控制权限内,不能把构造和析构的任务强加到malloc/free上。
申请的内存所在位置不一样
new才佐夫是从自由存储区上为对象动态分配内存空间,而malloc是从堆上分配空间。自由存储区是C++基于new操作的一个抽象概念。凡是通过new操作符进行内存申请,该内存即为自由存储区。而堆是操作系统中的术语,是操作系统所维护的一块特殊的内存,用于程序的内存动态分配。自由存储区不仅可以是堆,还可以是静态存储区,这都得看new在哪里为对象分配内存。
返回类型安全性
new分配成功时,返回对象类型的指针,类型于对象进行匹配,无须继续类型转换,故new是符合类型安全性的操作符。
而malloc内存分配是返回void* ,需要通过强制转换void* 指针转换构成我们所需要的类型。
内存分配失败的返回值
new失败是会抛出bac_alloc一场,他不会返回NULL
malloc分配失败时会返回NULL
是否需要指定内存大小
new无需指派需分配的大小,编译器会根据类型自动计算
malloc需要显示指派空间大小
是否调用构造/析构函数
new:
- 调用operator new操作符,分配一块足够大的空间,原始的,未命名的;
- 编译器运行相应的构造函数以构造对象,并为其传入初值;
- 对象构造完成后返回一个指向该对象的指针;
delete: - 调用对象析构;
- 调用delete
允许重载new,malloc不可以
分配内存扩充问题
malloc又realloc可以重新计算大小,new不行,new无法直接处理