当前位置:网站首页>new / malloc / delete / free之间的区别
new / malloc / delete / free之间的区别
2022-08-03 05:23:00 【圆月弯刀鞘】
一、区别
malloc和free是C的库函数
new和delete是运算符new可以做内存的开辟和初始化操作,不需要类型转换
malloc只能开辟内存,不能做初始化,需要类型转换malloc开辟内存失败是通过判断返回的指针是否nullptr
new开辟内存失败是通过抛出bad_alloc类型的异常进行判断malloc开辟数组内存后free的时候和普通变量方式相同
而delete释放数组的内存空间时需要加 []new创建实例对象的时候先开辟空间在调用构造函数初始化,delete删除实例对象的时候先调用析构函数销毁对象再回收空间。malloc和free只是开辟空间和释放空间,并不会调用构造函数和析构函数进行初始化和对象销毁。
int *p = (int*)malloc(sizeof(int));
if(nullptr == p){
return -1;
}
free(p);
try{
int *p1 = new int(10);
}catch(const bad_alloc &e){
return -1;
}
int *p2 = (int*)malloc(sizeof(int)*20);
free(p2); //释放数组空间和释放普通变量形式相同
int *p3 =new int[20]; //只开辟内存,不初始化
int *p4 = new int[20](); //开辟内存,初始化为0
delete[]p3; //回收数组空间
delete[]p4;
二、new的不同使用方法
int *p1 = new int(20); //普通的new
int *p2 = new (nothrow) int(20); //不抛出异常的new
const int *p3 =new const int(20); //开辟常量的new
int data = 0;
int *p4 = new (&data) int(20); //定位new
三、工作原理
malloc分配内存的时候会额外的分配4个字节来存放分配空间的大小,这4个字节在返回的指针前面,所以free的时候才知道需要释放掉的空间大小。
new运算符首先使用operator new开辟内存,然后初始化对象
delete运算符首先调用销毁对象,然后再用operator delete释放内存new和delete在开辟和释放内存的时候使用的还是malloc和free
如果想要手动管理内存,可以重写operator new和operator delete函数
边栏推荐
猜你喜欢
随机推荐
时间盲注脚本
中国聚氯乙烯(PVC)土工膜发展动态及投资前景预测报告2022~2028年
icebreaker的垃圾话学习指南
`monorepo` 中 `hoist` 机制导致加载配置文件路径的变化
编程软件配备
【frp内网穿透】
【CSRF,SSRF,XXE,PHP反序列化,Burpsuite】
opencv目标检测
Oracle 注释详解(--、/**/、rem)
Execute the mysql script file in the docker mysql container and solve the garbled characters
【DC-4 Range Penetration】
【反弹shell与提权】
中国石油行业并购重组趋势与投资战略规划建议报告2022~2028年
BeanFactory和FactoryBean的区别
MySQL 下载和安装详解
嵌入式实验二注意点
【XSS,文件上传,文件包含】
自我监督学习和BERT模型
php连接数据库脚本
Hook初探索