new与malloc的区别是一道经典的面试题,先整理一下,希望面试的时候能用到。
new与malloc的区别
0、new/delete是运算符,需要编译器支持;malloc/free是库函数,需要头文件支持。
1、new分配内存是按照数据类型分配,不需要指定内存块的大小;malloc分配内存是按照指定内存大小进行分配。
2、new在分配内存的过程中还回调用构造函数,delete释放空间时会调用析构函数;malloc/free在分配空间的之后不会调用构造函数和析构函数。
补充:new的实现原理:①创建一个新的对象;②将构造函数的作用域赋值给这个新的对(因此this指向了这个新的对象);③执行构造函数中的代码(为这个新对象添加属性);④返回新对象
3、new的返回值类型是指定对象的指针;malloc的返回值类型是void *,所以malloc的返回值一般需要进行类型转化。
4、new内存分配失败时会抛出异常(bad_alloc);malloc内存分配失败返回NULL。因此在使用new时经常会使用try…catch语法,而malloc则判断指针的返回值,而为了兼容c程序员的习惯,经常采用new nothrow的方法禁止抛出异常而返回NULL。
5、new会先调用operator new函数申请足够的内存(通常底层使用malloc现)。然后调用类型的构造函数,初始化成员变量,最后返回自定义类型指针。delete先调用析构函数,然后调用operator delete函数释放内存(通常底层使用free实现);malloc/free是库函数,只能动态的申请和释放内存,无法强制要求其做自定义类型对象进行构造和析构函数。
6、new和new[]的区别:new[]一次性分配所有内存,多次调用构造函数,分别搭配使用delete和delete[](delete[]多次调用析构函数,销毁数组中的每个对象);malloc只能使用 sizeof(int) * n;
7、new操作符从自由存储区(free store)上为对象动态分配内存空间,而malloc函数从堆上动态分配内存(自由存储区不等于堆)。
8、malloc在分配内存不够的情况下可以使用realloc进行扩容;new没有这样的操作。