C/C++内存分配方式——堆、栈、自由存储区、全局/静态存储区和常量存储区
栈:
??栈最主要的作用就是 存储局部变量,实现函数调用。 栈的功能和数据结构的栈一样,因此可以进行函数调用。栈的一大特点就是 内存自动分配回收。 用户进程执行时位于用户虚拟地址空间的顶部的就是用户栈。局部变量和函数参数等存储在用户栈,在这些变量作用范围失效时会自动出栈,释放所使用的存储空间。
堆:
??堆区分配也称为动态内存分配,与栈不同,堆的内存是由程序员手动完成申请和释放的。使用内存分配函数 (malloc、new)来申请 任意大小的内存,使用完之后,由程序员使用函数 (free、delete)手动的释放 申请的内存。如果程序员没有回收申请的内存,将会造成内存泄露问题(内存泄露就是内存资源的浪费,这片申请的内存空间只有该进程被杀死后才会被其他进程使用。)。
静态存储区(全局存储区)
??静态变量和全局变量是相似的,它不会随着函数的调用和退出而发生变化。 即上次调用函数的时候,如果我们给静态变量赋予某个值的话,下次函数调用时,这个值保持不变。在内存分配上全局变量和静态变量是存放在一起的,初始化的全局变量和静态变量放在一块区域,未初始化的全局变量和静态变量放在另一块区域。由于全局变量是程序全程需要使用的,静态变量是不可更改的,因此该区域的内存释放只有在程序结束时释放。 ??(静态变量的修饰关键字是static,static可以作用于变量以及函数。由static修饰的,可分为 静态局部变量,静态全局变量,静态函数。 static修饰类中的成员变量和成员函数成为静态成员变量和静态成员函数,这将使其成为类的一部分,而不是对象的一部分。意思就是说在创建类的一个实例的时候静态成员变量将不占用内存空间,可以减少内存消耗。)
常量存储区
??常量存储区存放的是常量,是不允许修改的,修改会报错。(非正当手段也可以修改)常量使用const修饰,常量的定义必须在定义时赋值,否则无法使用。最常见的常量是字符串常量,如果为给字符串申请内存空间就赋值,它将变成一个字符串常量,你所赋值得到的变量名只存储了该字符串常量的首地址,修改字符串将会报错。
自由存储区
??自由存储是C++中通过new和delete动态分配和释放对象的抽象概念,并不是真正意义上内存分配的存储区,通过new来申请的内存区域可称为自由存储区。 ??基本上,所有的C++编译器默认使用堆来实现自由存储,也就是说new和delete是使用malloc和free来实现的,这时藉由new运算符分配的对象,说它在堆上也对,说它在自由存储区上也正确。但程序员也可以通过重载操作符,改用其他内存来实现自由存储,例如全局变量做的对象池,这时自由存储区就区别于堆了。我们所需要记住的就是:堆是操作系统维护的一块内存,而自由存储是C++中通过new与delete动态分配和释放对象的抽象概念。堆与自由存储区并不等价。
|