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

C++内存分布malloc-free-new-delete的区别和联系

目录

一、内存分布

1.1内存分布图:

 1.2 为什么要将bss和data区分开呢?

1.3 堆和栈有什么区别

 二、malloc、free;new、delete

2.1  new和delete是如何实现的,new与malloc的异同处

2.2既然有了malloc/free,C++为什么还需要new/delete


一、内存分布

1.1内存分布图:

 1.2 为什么要将bss和data区分开呢?

在程序编译的时候,不会给.bss段中的数据分配空间,只是记录数据所需空间的大小。在程序执行的时候,才会给.bss段中的数据分配内存。通过这种方式,可以节省一部分内存空间,进一步缩减可执行程序的大小。

1.3 堆和栈有什么区别

堆是由malloc和new动态开辟的一段内存,由程序员自己管理和释放。栈则是由编译器自己开辟和管理的内存,一般用来存放函数的传参和局部变量。

空间由于频繁开辟和释放,所以会产生内存碎片的问题。

堆的生长空间向上,地址越来越大,栈则是向下,地址越来越小。栈的空间很小只有8M,而堆有4G。

 二、malloc、free;new、delete

2.1  new和delete是如何实现的,new与malloc的异同处

new和delete是对malloc和free的封装,new一个对象时,会首先调用malloc分配空间,然后执行对象的构造函数初始化这块空间,delete则会先调用对象的析构函数,然后调用free释放这块空间。

他们最大的区别则是 1、new会调用构造函数初始化空间。2、new并不需要指定资源的大小。3、new的返回值是对象类型的指针,而malloc则是void * 的指针。4、new如果调用失败,则会抛异常,而malloc调用失败则会返回NULL。5、new是一个操作符,malloc则是函数,operator new可以被重载。

2.2既然有了malloc/free,C++为什么还需要new/delete

这四个函数都是用来申请和释放内存。new/delete主要是对malloc/free进行了封装,使其能更好地申请和释放C++的对象资源,否则就得malloc一块空间,然后手动调用构造函数。

而malloc/free是已经编译好的库函数,其还要兼容C语言,不能够轻易修改,所以将其封装起来实现了new/delete。

http://www.lryc.cn/news/43888.html

相关文章:

  • 【华为OD机试 2023最新 】 最多颜色的车辆(C++ 100%)
  • Linux安全加固
  • Java基础学习(6)
  • 【LeetCode】链表练习 9 道题
  • 轴承远程监控系统解决方案
  • 阿里云轻量服务器Workbench root远程连接和一键连接的区别
  • 带你用纯C实现一个内存池(图文结合)
  • ChatGPT使用案例之图像生成
  • 蚁群算法优化旅行问题
  • 树数据结构
  • Spring Boot整合Redis并提供多种实际场景的应用
  • VR全景图片,助力VR全景制作,720全景效果图
  • Kali Linux20款重要软件
  • C语言测试五
  • 【微服务~原始真解】Spring Cloud —— 访问数据库整合Druid数据源
  • 前端入门必刷题,经典算法—两数之和
  • ‘海外/国外‘地区微博签到shu据(正题在第二部分)
  • Springboot——SB整合Mybatis的CURD(基于注解进行开发)
  • 现在大专生转IT可行吗?
  • XC7A50T-1CSG324I、XC7A50T-2CSG324I Artix-7 FPGA可编程门阵列
  • linux安装图片处理软件ImageMagick
  • 【Java基础】JavaCore核心-反射技术
  • AWGN后验估计下的均值与协方差关系(向量和标量形式)
  • Linux常用命令之文件搜索命令
  • ChatGPT给软件测试行业带来的可能
  • Cadence Allegro 导出Properties on Nets Report报告详解
  • JAVA代码 实现定位数据动态聚集并绘制多边形区域
  • 基于储能进行调峰和频率调节研究【超线性增益的联合优化】(Matlab代码实现)
  • 体验 Linux 的几个监控命令(htop、nmon、netdata)
  • NOC大赛2022NOC软件创意编程初赛图形化小低组(小学高年级组)