【C\C++】C和C++的内存管理

本文详细介绍了C和C++的内存管理,包括内存分布(BSS段、数据段、代码段、堆和栈)和内存分配方式(malloc、calloc、realloc、free以及new、delete、new[]、delete[])。C++中的new运算符不仅分配空间,还会调用构造函数,而delete会调用析构函数。文章强调了正确匹配内存分配和释放的重要性,以及malloc与new的区别和兼容性问题。
摘要由CSDN通过智能技术生成

(一)内存分布

    1.1 C

  •  BSS段: 用来存放程序中未初始化的全局变量和未初始化的静态变量。
  •  数据段:用来存放程序中已初始化的全局变量和已经初始化的静态变量。
  • 代码段:用来存放程序执行代码。在代码段中,也有可能包含一些只读的常数变量,例如字符串常量等
  • 堆:堆是用于存放进程运行中被动态分配的内存段,它的大小并不固定,可动态扩张或缩减。当进程调用malloc/free等函数分配内存时,新分配的内存就被动态添加到堆上(堆被扩张)/释放的内存从堆中被剔除(堆被缩减)
  • 栈:栈又称堆栈, 存放程序的局部变量(但不包括static声明的变量,static意味着在数据段中存放变量)。除此以外在函数被调用时,栈用来传递参数和返回值。由于栈的先进先出特点,所以栈特别方便用来保存/恢复调用现场。

    1.2 C++

  • 栈:存放为运行函数而分配的局部变量、函数参数、返回数据、返回地址等;在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。
  • 堆:就是那些由new分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。
  • 自由存储区:就是那些由malloc等分配的内存块,他和堆是十分相似的,不过它是用free来结束自己的生命的。
  • 全局/静态存储区:存放全局变量、静态数据,const常量。在以前的C语言中,全局变量又分为初始化的和未初始化的,在C++里面没有这个区分了,他们共同占用同一块内存区。
  • 常量存储区:这是一块比较特殊的存储区,他们里面存放的是不允许被修改的常量字符串。

(二)内存分配方式

    2.1 C中内存的动态分配

         2.1.1 malloc、relloc、calloc和free

         1、void* malloc(字节数):无初始化的申请一块内存

         2、void* calloc(单个元素字节&#x

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值