一、C++内存管理
c++内存管理主要以下几个区:
- 栈
存储函数内局部变量,函数结束可自动销毁,内存容量有限,但栈内存分配运算内置于处理器的指令集中,效率很高 - 堆
程序执行时通过new/malloc等动态分配内存,需手动销毁,如果忘记销毁,可产生内存泄漏,不过程序退后后,可由系统自动释放。32bit的机器,内存容量可达到64GB。 - 静态存储区域
存储静态/全局变量,在程序编译期就已经分配好相应内存,存在与程序的整个生命周期。
这里我们引申一个概念,进程的内存管理分配。
- BSS段
存储未初始化的静态/全局变量,属于静态内存分配 - 数据段
存储初始化的静态/全局变量,属于静态内存分配 - 堆
存储进程运行中动态分配的内存。 - 栈
存储进程运行中临时创建的局部变量 - 代码段
存储程序执行代码的区域,一般是只读
结论:从上面比较知道,语言范畴内的内存分配策略,其实是框在系统层面的内存分配里的。其中C++静态存储区域分别对应在BSS段和数据段,栈和堆一一对应。这个是两个层面的概念,切勿混淆。
看个例子,巩固一下概念:
#include <stdlib.h>
int a=123; //a在全局已初始化数据区
char *p1; //p1在BSS区(未初始化全局变量)
int main()
{
int b; //b为局部变量,在栈区
char s[]="abc"; //s为局部数组变量,在栈区
//"abc"为字符串常量,存储在已初始化数据区
char *p1,*p2; //p1,p2为局部变量,在栈区
char *p3="123456"; //p3在栈区,"123456"在常量区(.rodata)
static int c=456; //c为局部(静态)数据,在已初始化数据区
//静态局部变量会自动初始化(因为BSS区自动用0或NULL初始化)
p1=(char*)malloc(10); //分配得来的10个字节的区域在堆区
p2=(char*)malloc(20); //分配得来的20个字节的区域在堆区
free(p1);
free(p2);
p1=NULL; //显示地将p1置为NULL,避免以后错误地使用p1
p2=NULL;
}