当前位置:网站首页>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函数
边栏推荐
猜你喜欢
【frp内网穿透】
Browser multi-threaded off-screen rendering, compression and packaging scheme
陆运信息系统——班列项目总结(一)
icebreaker的垃圾话学习指南
下拉框数据字典应用案例
npm run dev/serve 时报错
The ` monorepo ` ` hoist ` mechanism lead to the change of the loading configuration file path
Qlik Sense 聚合函数及范围详解(Sum、Count、All、ToTaL、{1})
ASP.NET MVC3的伪静态实现
Leetcode刷题——一些用层次遍历解决的问题(111. 二叉树的最小深度、104. 二叉树的最大深度、226. 翻转二叉树、剑指 Offer 27. 二叉树的镜像)
随机推荐
中国食品产业园区行业前景规划建议及投融资模式分析报告2022~2028年
陆运信息系统——班列项目总结(一)
NFT租赁提案EIP-5006步入最后审核!让海外大型游戏的链改成为可能
Greetings(状压DP,枚举子集转移)
寄存器常见指令
中国水环境治理行业投融资分析及“十四五”规划建议报告2022~2028年
用iPhone前摄3D人像建模,Meta:我看行
Kettle 从资源库中载入新的转换出错(Invalid byte 1 of 1-byte UTF-8 sequence)
【Yarn】yarn常用命令 查看日志和Kill任务
浏览器多线程离屏渲染压缩打包方案
动漫:海贼王女
Oracle count(1)、count(*)、count(列) 区别详解
npm run dev/serve 时报错
动态规划笔记
Mysql 外键详解(Foreign Key)
该描述怎么写成SQL语句
【Arduino】关于“&”和“|” 运算-----多个参数运算结果异常的问题解决
嵌入式实验四
【源码解读】火爆的二舅币真的跑路了吗?
玩转Markdown(2) —— 抽象语法树的提取与操纵