博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
程序的堆区和栈区
阅读量:6607 次
发布时间:2019-06-24

本文共 1845 字,大约阅读时间需要 6 分钟。

关于进程的内存的分配参考博文:http://blog.csdn.net/hongchangfirst/article/details/6917829

 

这里主要说说堆区和栈区的区别:

1.堆区是程序里动态分配的内容,堆区的内存容量大,使用灵活,分别后要自行回收容易产生内存碎片。

2.栈区主要是存储函数的局部变量,然后程序结束后操作系统自行回收但是栈区容量比较小。

 

 

我们看下面这段测试代码:

1 #include 
2 using namespace std; 3 4 5 int main() 6 { 7 int *DArea; 8 int SArea[1024*252]={
1,2,3,4,5}; 9 DArea=new int[5];10 for(int i=1;i<=5;i++)11 {12 DArea[i-1]=i*10;13 }14 15 /************************************************************************/16 /* DArea动态分配5个int大小的内存,分配在程序的堆区17 SArea为局部变量,在栈区分配5个int大小的内存*/18 /************************************************************************/19 return 0;20 }

 

我把断点打到return 0;这一句查看一下内存:

可以看出来前面四个地址均为0x0012ffxx,,而后面两个地址为:0x00252fxx说明前面的四个元素是分配在一起的而后面两个元素是分

配在一起的那么我们可以猜测前面四个元素是存在于程序栈区,而后面两个元素是存在于程序堆区。

 

&SArea[1]-&SArea[0]=sizeof(int),&DArea[1]-&DArea[0]=sizeof(int)说明无论是分配在堆区的数据还是分配在栈区的元素都是连

续存放的。

 

另外&SArea=&SArea[0]说明在栈区中数组名和数组第一个元素是等价的。然而&DArea!=&DArea[0] 

 

我们再看看

 

DArea=&DArea[0],&DArea!=&DArea[0]说明动态分配的数组在栈中保存了一个指针,该指针指向堆区的第一个元素的地址。正是这

一点是与在栈中分配数据最大的区别。

 

我们再梳理下:

对于在栈区中分配的数组,其数组名和数组中的一个元素占用同一块地址。对于在堆区中分配的数据,其数据名是在栈中分配的一个指

针变量,该变量保存的一个堆区的一个元素地址,该元素正是动态分配在堆的第一个元素地址。

 

然而这里就揭示的内存泄露的原理,当我们再堆区中分配的内存如果没有手工释放,程序结束后会把栈中的内存回收释放,该栈中保存

了一个指向堆区元素的指针。然而这个指针一旦释放了后,就再也没有元素指向堆区的那块元素,然而堆区中的那块元素又没有释放,

自然而然的造成了内存泄露。

 

此外还有一点需要说明:

既然栈区大小有限,那到底是多大呢,VC里默认分配1M的栈空间。当超过这个栈空间大小的时候会提示stack overflow。

 

那么我们来分配一个很大的数据(1024*1536>1M)来测试一下:

1 #include 
2 using namespace std; 3 4 5 int main() 6 { 7 int *DArea; 8 int SArea[1024*1536]={
1,2,3,4,5}; 9 DArea=new int[5];10 for(int i=1;i<=5;i++)11 {12 DArea[i-1]=i*10;13 }14 return 0;15 }

提示:

 

 

那怎么改栈空间的大小呢,

在VC里面:工程-设置-链接-输出-将堆栈输出中保留一项改为0x1000000(10M)我们再试试看:

 

 

这下没有提示栈溢出错误了。

 

 

 

好了,就到这里吧。希望我的总结能对你有一点点帮助。

 

转载于:https://www.cnblogs.com/vpoet/p/4680720.html

你可能感兴趣的文章
Python正则表达式初识(十)附正则表达式总结
查看>>
APICLOUD 1.1.0 开发环境搭建
查看>>
《Cadence 16.6电路设计与仿真从入门到精通》——导读
查看>>
Confluence 6 如何让我的小组成员知道那些内容是重要的
查看>>
找到一个适合的分布式文件系统之各种分布式文件系统优缺点对比
查看>>
索引失效的几个原因
查看>>
五险一金,你清楚吗?
查看>>
Ip核_fifo
查看>>
repquota命令--Linux命令应用大词典729个命令解读
查看>>
rabbitmq 管理及常用命令
查看>>
HTTP要被抛弃? 亚洲诚信携手宝塔开启HTTPS加密快速通道
查看>>
6.6 tar打包
查看>>
Spring MVC核心技术
查看>>
TCP协议如何保证传输的可靠性
查看>>
Spring Cloud云架构 - SSO单点登录之OAuth2.0 登出流程(3)
查看>>
软件开发各阶段交付物列表
查看>>
ntp服务器的搭建
查看>>
六、nginx搭建织梦DedeCms网站
查看>>
Tair学习小记
查看>>
网卡绑定(服务器&&交换机),缓存服务器Squid架构配置
查看>>