C++内存管理机制

内存五大分区

C++内存管理机制_第1张图片
1.栈区
程序运行时分配内存。
c++程序运行时分配内存,主要存储函数的参数以及局部变量。
局部变量分配内存时在栈区从高地址到低地址查找空的内存区域进行分配。
局部变量定义在函数内部,当函数调用时分配内存,在函数结束时消亡,内存将自动被释放。
2.堆区
程序运行时分配内存
堆区又称动态内存分配区,主要存储new或者malloc出来的内存,分配内存时在内存的堆区中从低地址到高地址寻找空的内存区域进行分配。
delete或者free后回收内存,如果没有delete或者free操作则在程序运行结束后由操作系统回收内存。
3.全局区
程序编译时分配内存
全局区又称静态区,主要存储程序中的全局变量和一些static的静态变量。全局变量分配内存时在全局区从低地址到高地址查找空闲的内存区域进行分配。
4.常量区
存储字符串常量、整形常量等一些列常量的区域。
5.代码区
存放程序执行的cpu指令。
new或malloc出来的变量动态的分配在堆区中,当delete或free时释放堆区内存空间。

#include
using namespace std;
int p=1;//存储在全局已初始化区
int q;//存储在全局未初始化区
void test(int a)
{
    int b,c;
}//a,b,c均存放在栈区中

int main()
{
    int *ps=new int;//ps存储在栈区中,new出来的内存存储在堆区中
    char str[20]="123456";//str存储在栈区,“123456”为字符串常量存储在常量区
    delete ps;
    return 0;
}

存储方式

存储方式分为如下三种:
1.自动存储
在函数内部定义的常规变量以及函数的参数使用自动存储空间,随着函数的调用分配空间,随着函数的结束释放内存空间。
2.静态存储
静态存储是整个程序执行期间都存在的存储方式。全局变量以及一些声明比哪里那个时使用了static关键字的变量采用静态存储。
3.动态存储

hint

正在运行的C程序 = 代码段+初始化数据段(data)+未初始化数据段(BSS)+堆+栈
编译时确定分配多少代码段+初始化数据段+未初始化数据段+栈。
数据段 – data
data包含静态初始化的数据,所以有初值的全局变量和static变量在data区。段的起始位置也是由连接定位文件所确定,大小在编译连接时自动分配,它和你的程序大小没有关系,但和程序使用到的全局变量,常量数量相关。数据段属于静态内存分配。
bss段–bss
bss是英文Block Started by Symbol的简称,通常是指用来存放程序中未初始化的全局变量的一块内存区域,在程序载入时由内核清0。BSS段属于静态内存分配。

你可能感兴趣的:(c++)