c++ 简易内存模型

40 篇文章 0 订阅

在这个模型中,我们将会把一个 C++ 程序在运行的时候所占据的内存空间,分成以下四个部分:

  • 堆区(Heap)
  • 栈区(Stack)
  • 全局静态变量区(Static)
  • 常量区(Constant)

在 C++ 程序的内存空间中,

我们在代码中声明的局部变量,以及函数的形式参数,
都保存在栈区中——这部分内存在程序运行的时候会自动分配,而在不需要的时候也会自动释放,并不需要程序员自己去手动维护。

而我们使用new运算符,或者 C 语言中的malloc函数进行动态内存分配之后,系统为我们划分的内存空间,就来自于堆区。
因为程序自己并不知道这些动态分配的内存到什么时候会派不上用场,所以程序并不会对这部分已经分配的内存做任何处理。

对于全局变量:静态( static )变量,其保存在内存中的全局/静态区( Global/Static )——全局变量和静态变量是存储在同一块内存空间中的。我们可以简单地认为,程序启动之后,全局/静态变量就保存在这里,而程序结束之后,对应的内存空间将会自动释放。

最后是常量( Constant )区——实际上在实际的程序中并不存在这样一个区域,这里只是为了让大家方便理解。我们可以简单地认为,所有的常量(以const开头)都存放在一起——这些区域不可释放。

例如

int array[3];
int myFunc(){
    int a;
    char *p;
    char* str="Aloha Oe!";
}

对于这一段代码,我们可以知道,数组array是全局变量,保存在全局/静态区;函数myFunc中定义的局部变量a,p,str都保存在栈区,而"Aloha Oe!"是一个字符串常量,保存在常量区。

int myFunc2(){
    int *p=new int[2];
}

同样进行上面的分析:指针p是局部变量,建立在栈区,而p指向的具有两个元素的数组,作为一个堆对象而位于堆区中。大家这里一定要注意,不要把指针变量指针变量所指向的堆对象搞混了。

以上来自计蒜客 :)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值