C++内存分类

内存分为5个区:栈,堆,自由存储区,全局/静态存储区,常量存储区。

 

栈区:内存由编译器再需要时自动分配和释放。通常用来存储局部变量和函数参数。(为运行函数而分配的局部变量,函数参数树,返回地址等存放在栈区)。栈运行分配内置于处理器的指令之中,效率高,但是分配的内存容量有限。

 

堆区:内存由new分配的内存块,他们的释放搬移其不管,有我们的应用程序区控制,一般一个new就要对应一个delete,如果程序员没有释放掉,那么程序救赎后,操作系统自动回收。

 

C++栈区内存与堆区内存的区别

自由存储区:使用malloc进行分配,使用free进行回收。和堆类似。

 

全局/静态存储区:全局变量和静态变量备份陪到同一块内存中,C语言中分初始化和未初始化的,C++中不再区分。(全局变量,静态数据,常量存放再全局数据区)

 

常量存储区:存储常量,不允许被修改。

 


静态存储区:内存再程序编译的时候就已经分配号,这块内存再程序的整个运行期间都存在。它主要存放警惕啊数据,全局数据和常量。

栈区:在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置与处理器的指令集中,效率很高,但是分配的内存容量有限。

堆区:亦称作动态内存分配。程序再运行的时候用malloc或new申请任意大小的内存,程序员自己负责在适当的时候使用free或delete释放内存。动态内存的生存其可以有我们决定,如果我们不是放内存,程序将再最后才释放掉动态内存。但是,良好的编程习惯是:如果某动态内存不再使用,需要将其释放掉,否则,我们认为发生了内存泄漏现象。

 

典型C++内存区域:

\

解析:

simple :

int fun(){
    int *p = new int[5];
    delete [] p;
}

new分配类一块堆内存,指针p分配了一份栈内存,所以这句话的意思是:在栈内存中存放了一个指向一块堆内存的指针p。程序会先确定堆中分配内存的大小,然后调用operator new分配内存,然后返回这块内存的首地址,放入栈中。

注意释放堆内存时,我们需要使用delete [] p;

#include <iostream>
#include <cstring>
int a = 0; //全局初始化区
char *p1;//全局未初始化区

int main(){
    int b;  //栈
    char s[] = "abc";   //栈
    char *p2;   //栈
    char *p3 = "123";   //“123”在常量区,p3在栈上。
    static int  c = 0;  //全局(静态)初始化区
    p1 = (char *)malloc(10);//
    p2 = (char *)malloc(20);//分配来的10和20字节的区域就是堆区。
    strcpy(p1,"123");   //“123”在常量区,编译器将它与p3指向的123优化为一个地方。
}

参考文章:https://blog.csdn.net/richerg85/article/details/19175133

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值