malloc 与 new 区别
来源:互联网 发布:plc编程招聘东莞 编辑:程序博客网 时间:2024/06/15 15:13
malloc
int *p = (int *) malloc(sizeof(int) * length);
free
free(p)
new
int *p2 = new int[length];
A *a = new A
delete
delete a[]
相同点:
1.都可以用于动态申请内存。
2.申请的内存都需要手动释放。
不同点:
1.malloc/free 是C/C++的标准库函数,new/delete是c++运算符。
2.malloc/free要库文件支持,new/delete 不需要。
3.malloc申请内存时,需要知道申请内存的总字节数。不知道申请的内存是什么类型的
new 申请内存时,不需要一定写明申请的内存大小。自动计算需要分配的空间。
4.new是类型安全的
int* p = new float[2]; // 编译时指出错误
int* p = malloc(2*sizeof(float)); // 编译时无法指出错误
5.new 由operator new 和 construct组成,new会调用constructor,而malloc不能;delete 调用destructor,free不能。
6.new/delete的功能大部分完全覆盖了malloc/free,但是若是C程序,就只能调用malloc/free管理内存。
7.new/delete中的operator new/operator delete 可以被重载的。
8.能够重新分配内存
malloc分配后,如果使用时发现内存不足,可以使用realloc函数进行内存重新分配实现内存的扩充。realloc先判断当前的指针所指内存是否有足够的连续空间,如果有,原地扩大分配内存地址,并返回原来的指针地址;如果空间不够,按照新的地址分配空间,将原有数据拷贝到新地址,并释放原来的内存区域。
9.返回类型不一样
malloc返回的类型是void *,在调用时要显式地进行类型转换,转换void *到所需要的指针类型。
new 是明确知道返回是什么类型的。
10.内存分配失败时,new 抛出异常,malloc分配失败时返回NULL。
11.malloc 用free释放,new用delete 释放。
用free释放new创建的动态对象,因为无法执行西沟函数可能导致出错。如果用delete释放”malloc申请的动态内存”,理论上程序不会出错,但是程序可读性变差。
参考表格
特征
new/delete
malloc/free
分配内存的位置
自由存储区
堆
内存分配失败返回值
完整类型指针
void*
内存分配失败返回值
默认抛出异常
返回NULL
分配内存的大小
由编译器根据类型计算得出
必须显式指定字节数
处理数组
有处理数组的new版本new[]
需要用户计算数组的大小后进行内存分配
已分配内存的扩充
无法直观地处理
使用realloc简单完成
是否相互调用
可以,看具体的operator new/delete实现
不可调用new
分配内存时内存不足
客户能够指定处理函数或重新制定分配器
无法通过用户代码进行处理
函数重载
允许
不允许
构造函数与析构函数
调用
不调用
参考资料:
1.http://www.linuxidc.com/Linux/2016-01/127591.htm
- new与malloc区别
- malloc与new区别
- malloc与new区别
- new与malloc区别
- new与malloc区别
- malloc与new区别
- new与malloc区别
- new与malloc区别
- malloc与new区别
- malloc 与 new 区别
- Malloc与new的区别
- malloc与new 的区别
- Malloc与new的区别
- Malloc与new 的区别
- malloc 与new 的区别
- Malloc与new的区别
- new与malloc的区别
- malloc与new的区别
- Python中Unicode字符串
- 数据结构学习之路2 链表存储的线性表
- 大数据技术的回顾与展望 ——写在Hadoop十周年纪念
- 运行tomcat9w.exe tomcat9.exe ,提示 指定的服务未安装unable to open the service 'tomcat9'
- 标准分幅下的图幅号转换成经纬度坐标【原理+源代码】
- malloc 与 new 区别
- Misha and Changing Handles
- 除Hadoop外你还需要知道的9个大数据技术
- 数据结构学习之路3 堆栈的基本操作
- 学习笔记TF033:实现ResNet
- 最短路
- LS8-linux系统调用方式文件编程之学习笔记
- Vue实现组件信息的缓存
- 函数