C/C++C++内存管理

Posted mick_seu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C/C++C++内存管理相关的知识,希望对你有一定的参考价值。

内存管理一直是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++局部静态变量的内存什么时候创建的?

以上是关于C/C++C++内存管理的主要内容,如果未能解决你的问题,请参考以下文章

C/C++内存管理

C&C++内存管理

C&C++内存管理

C/C++内存管理

C/C++内存管理

C/C++C++内存管理