【C/C++】C++内存管理

本文详细介绍了C/C++中的内存管理机制,包括栈、堆、全局/静态存储区及常量存储区的区别,并探讨了不同存储区的变量存储周期及其初始化方式。

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

内存管理一直是C++的一个难题,这里我借助几篇博文好好“预习”一下。

C/C++内存管理详解(ShinChan's Blog)

c++ 全局变量初始化的一点总结(twoon)


C的内存分为:

1)栈 - 由编译器自动分配释放

2)堆 - 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收

3)全局区(静态区)- 全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。- 程序结束释放

4)常量区 - 存放常量



C++的内存则分为:

1)栈:函数内局部变量在栈上创建,函数执行结束时这些存储单元自动被释放。

2)堆:由 new 动态分配,由 delete 动态释放。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。

3)自由存储区:由 malloc 分配的内存块,用 free 释放内存,与堆类似。

4)全局/静态存储区:全局变量和静态变量被分配到同一块内存中,在以前的C语言中,全局变量又分为初始化的和未初始化的,在C++里面没有这个区分了,他们共同占用同一块内存区。

5)常量存储区:这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改。(当然,你要通过非正当手段也可以修改,而且方法很多)



分布在不同内存的变量其存储期也不同:栈上的数据生存期仅限于其身处的block(自动存储期),堆上的数据生存期从 new 开始到 delete(动态存储期),自由存储区的数据类似。剩下两种变量具有静态存储期,拥有静态存储期的数据在编译过程中分配好了空间,初始化过程在main函数之前,可能在编译过程中完成,也可能是在运行过程中完成。


拥有静态存储期的变量初始化可以划分为以下两个不同的情况(c++11 N3690 3.6.2):

1、
static initialization:  静态初始化指的是用常量来对变量进行初始化,主要包括 zero initialization 和 const initialization,静态初始化在编译时完成,对简单类型(内建类型,POD等)来说,从具体实现上看,zero initialization 的变量会被保存在 bss 段,const initialization 的变量则放在 data 段内,程序加载即可完成初始化,这和 c 语言里的全局变量初始化基本是一致的。


2、dynamic initialization:  动态初始化主要是指需要经过函数调用才能完成的初始化,比如:int a = foo(),或者是复杂类型(类)的初始化(需要调用构造函数)等。这些变量的初始化会在 main 函数执行前由运行时调用相应的代码从而得以进行(函数内的 static 变量除外)。


需要注意的是:局部静态变量的内存确实是在编译时分配的,但初始化却是在第一次执行到代码时才进行。

参见知乎:C++局部静态变量的内存什么时候创建的?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值