编程小知识之一网打尽C++内存管理

一、C++内存管理

c++内存管理主要以下几个区:


  1. 存储函数内局部变量,函数结束可自动销毁,内存容量有限,但栈内存分配运算内置于处理器的指令集中,效率很高

  2. 程序执行时通过new/malloc等动态分配内存,需手动销毁,如果忘记销毁,可产生内存泄漏,不过程序退后后,可由系统自动释放。32bit的机器,内存容量可达到64GB。
  3. 静态存储区域
    存储静态/全局变量,在程序编译期就已经分配好相应内存,存在与程序的整个生命周期。

这里我们引申一个概念,进程的内存管理分配。

  1. BSS段
    存储未初始化的静态/全局变量,属于静态内存分配
  2. 数据段
    存储初始化的静态/全局变量,属于静态内存分配

  3. 存储进程运行中动态分配的内存。

  4. 存储进程运行中临时创建的局部变量
  5. 代码段
    存储程序执行代码的区域,一般是只读

结论:从上面比较知道,语言范畴内的内存分配策略,其实是框在系统层面的内存分配里的。其中C++静态存储区域分别对应在BSS段和数据段,栈和堆一一对应。这个是两个层面的概念,切勿混淆。

看个例子,巩固一下概念:

#include 
 
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;
}

你可能感兴趣的:(编程小知识)