当前位置: 首页 > news >正文

C++中malloc、free和new、delete的区别

malloc、free和new、delete的区别

基本概念

malloc、free

malloc、free是c语言中的库函数

void* malloc(long num_bytes);
void free(void *first_byte);

内存操作

malloc函数接收需要分配的内存字节数,如果内存足够,可以成功分配,会返回指向内存块起始位置的指针

free函数释放指针指向的内存,接收的参数是需要释放的内存的首地址

用法

malloc:

  1. malloc返回的是void*类型的指针,需要手动转换成指定类型的指针;
  2. malloc本身并不是别要申请的内存是什么类型,他只关心申请的内存的字节数
Type *ptr = (Type *)malloc(sizeof(Type) * length);

free:

free(ptr);

实际上,在调用malloc之后,返回给用户的指针指向的地址的前面还有一段元数据,这部分元数据记录了内存块的大小等数据

内存布局大概是这样的:| 元数据(记录大小等信息) | 用户数据区(malloc返回的指针) |
^                           ^
|                           |
系统知道的块起始地址        malloc返回的p

元数据的大小是固定的,所以在调用free函数的时候会先找到这部分元数据,获得内存块大小之后再执行释放内存

new、delete

new和delete是c++中的操作符

new在被调用的时候首先会申请内存,然后执行构造函数构造对象

delete在被调用的时候首先执行析构函数析构对象,然后才是释放内存

用法

  1. new可以自动计算要分配的内存大小,只需要传给new对象类型和数量,因为new内置了sizeof、类型转换和类型安全检查等功能;
  2. 要构造一个对象就new Type,构造多个就new Type[num]
  3. delete释放一个对象就delete obj,delete释放一个数组就delete []array

区别

  1. malloc、free是c语言的库函数,而new、delete是c++的操作符(操作符可以重载)
  2. new自动计算所需分配内存,malloc需要手动计算
  3. new返回的是对象类型的指针,malloc返回void*,需要类型转换成对象类型
  4. delete释放内存时需要对象类型的指针,free是void*类型的指针
  5. new分配失败会抛出异常,malloc分配失败返回NULL空指针;这是基于c和c++语言的区别
  6. new在free store上分配内存,malloc在堆上分配
    这里free store指的是,new是c++的运算符,运算符可以重载,所以对于new的实现,可以是调用malloc在堆上申请内存,也可能是定向到一块已经申请好的静态全局内存上
  7. new先调用operator new进行内存申请,然后调用构造函数初始化成员变量,最后返回指针
    delete先调用析构函数,在调用operator delete释放内存
    c++的类对象,既需要申请内存,还需要初始化操作,释放时也需要析构和释放内存两步,所以才有了new和delete
  8. new是类型安全的,而malloc不是
    int *p = new float[5];编译时会报错
    int *p = malloc(5 * sizeof(float));编译时不报错
http://www.dtcms.com/a/568541.html

相关文章:

  • 计算机视觉:python车辆行人检测与跟踪系统 YOLO模型 SORT算法 PyQt5界面 目标检测+目标跟踪 深度学习 计算机✅
  • 提高肠氧饱和度测量精度的新技术评估
  • 【数据集+源码+文章】基于yolov8+streamlit的12种水果品质、成熟度检测系统
  • Camera参数(3A)
  • 【C++:搜索二叉树】二叉搜索树从理论到实战完全解读:原理、两种场景下的实现
  • 高性能网络编程实战:用Tokio构建自定义协议服务器
  • H265 vs AV1 vs H266帧内块拷贝差异
  • CSS 中 `data-status` 的使用详解
  • 舟山企业网站建设公司微信小程序麻将辅助免费
  • VMware替代 | 详解ZStack ZSphere产品化运维六大特性
  • 缓存击穿,缓存穿透,缓存雪崩的原因和解决方案(或者说使用缓存的过程中有没有遇到什么问题,怎么解决的)
  • 关于数据包分片总长度字段的计算和MF标志位的判断
  • 手机网站建站流程网站建设卩金手指科杰
  • BuildingAI 用户信息弹出页面PRD
  • ​Oracle RAC灾备环境UNDO表空间管理终极指南:解决备库修改难题与性能优化实战​
  • 《uni-app跨平台开发完全指南》- 02 - 项目结构与配置文件详解
  • 【数据分析】基于R语言的废水微生物抗性分析与负二项回归模型建模
  • 深圳专业网站公司注册查询网站
  • k8s --- resource 资源
  • 神经网络之反射变换
  • k8s——pod详解2
  • 四层神经网络案例(含反向传播)
  • MySQL初阶学习日记(1)--- 数据库的基本操作
  • 【k8s】k8s的网络底层原理
  • 一种创新的集成学习模型:结合双通路神经网络与逻辑回归的糖尿病患病概率预测
  • 神经网络之线性变换
  • Fastlane 结合 开心上架(Appuploader)命令行版本实现跨平台上传发布 iOS App 免 Mac 自动化上架实战全解析
  • 大连网站建设平台宁夏考试教育网站
  • 微信网站对接室内设计师报考官网
  • Ceph常用的三种存储操作