c++内存格局

本文详细介绍了C++程序中的内存管理机制,包括五个主要区域:堆、栈、自由存储区、全局/静态存储区和常量存储区。阐述了每个区域的特性、使用方式及应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

c++程序的内存格局通常分为四个区:
全局数据区;
代码区;
栈区;
堆区(即自由存储区)。
 

  全局变量、静态数据、常量存放在全局数据区,

所有类成员函数和非成员函数代码存放在代码区,

为运行函数而分配的局部变量、函数参数、返回地址等存放在栈区,

余下的空间都被称为堆区;new和delete,malloc和free,都从堆中分配和释放内存块,但在具体操作上两者有很大的区别。


有持不同观点如下,也是一种分法!
根据《C++内存管理技术内幕》一书,在C++中,内存分成5个区,他们分别是堆,栈,自由存续区,全局/静态存续区,常量存续区。
  a) 栈:内存由编译器在需要时自动分配和释放。通常用来存储局部变量和函数参数。(为运行函数而分配的局部变量、函数参数、返回地址等存放在栈区)。栈运算分配内置于处理器的指令集中,效率很高,但是分配的内存容量有限。

    b) 堆:内存使用new进行分配,使用delete或delete[]释放。如果未能对内存进行正确的释放,会造成内存泄漏。但在程序结束时,会由操作系统自动回收。

    c) 自由存储区:使用malloc进行分配,使用free进行回收。和堆类似。

  d) 全局/静态存储区:全局变量和静态变量被分配到同一块内存中,C语言中区分初始化和未初始化的,C++中不再区分了。
  e) 常量存储区:存储常量,不允许被修改。

  这里,在一些资料中是这样定义C++内存分配的,可编程内存在基本上分为这样的几大部分:静态存储区、堆区和栈区。他们的功能不同,对他们使用方式也就不同。

 a)静态存储区:内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。它主要存放静态数据、全局数据和常量。

   b)栈区:在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。

   c)堆区:亦称动态内存分配。程序在运行的时候用malloc或new申请任意大小的内存,程序员自己负责在适当的时候用free或 delete释放内存。动态内存的生存期可以由我们决定,如果我们不释放内存,程序将在最后才释放掉动态内存。 但是,良好的编程习惯是:如果某动态内存不再使用,需要将其释放掉,否则,我们认为发生了内存泄漏现象。

内存被分成 程序代码区、堆区、栈区 还有个全局数据区

1.程序代码区:存放你的全部代码

2.堆区:存放用new 申请的变量(如 int a = new int(5))

3.栈区;存放int = 5;之类的变量(必须放在函数中)

4.全局数据区:存放全局或静态变量,即定义在函数外的,或加上static的变量
(如:static int a = 5;)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Coder_by

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值