new和malloc的10点区别
- 初始化:new,delete会调用构造、析构函数,malloc,free只会开辟和释放空间;
- 分配内存的位置:new在自由存储区分配,malloc在堆上分配;自由存储区可以是堆,也可以是静态存储区,具体看new的实现(有些库调用malloc);
- 失败:new失败抛出bad_alloc异常,绝不会返回null;,malloc返回null指针;
- 指定大小:new根据类型自动计算内存大小,malloc需要用sizeof指定大小;
- 返回类型:new返回对象指针,malloc返回void*;
- 数组:new可以new A[10],malloc只能malloc(sizeof(A) * 10);
- 互相调用:new可以调用malloc,malloc不能调用new;
- 重载:new,delete可以重载,标准库本身就有8个重载;
- 内存重分配:malloc可以重新分配内存(如果申请的不够):使用ralloc,如果原地址后面有足够空间,直接扩大;如果后面空间不够,另外开辟空间,拷贝,然后释放原空间;
- 内存不足:内存不足分配时,new可以调用new_handler函数指针(错误处理函数),用户调用set_new_handler(new_handler p),指定错误处理函数。
特征new/deletemalloc/free分配内存的位置自由存储区堆分配成功的返回值完整类型指针void*分配失败的返回值抛出异常返回null分配内存大小由编译器计算显示指定处理数组有重载版本new[],delete[]用户计算大小已分配内存的扩充无法直接处理用ralloc处理是否互相调用可以调用malloc,具体看实现不能调用new内存不足指定处理函数或者重载分配器无法自己处理重载允许不允许构造与析构调用不调用