界面模式
登录
注册
会员
帮助
加入收藏夹
客服微信
瑞星卡卡安全论坛
综合娱乐区
活动专区
实习生专区
实习生交流区
堆和栈的区别
企业产品讨论区
瑞星安全云终端软件
瑞星ESM防病毒终端安全防护系统
瑞星杀毒软件网络版(含Linux)
瑞星智能沙箱分析/恶意代码威胁监测分析/上网行为管理
瑞星防毒墙5.0、瑞星下一代防火墙
瑞星虚拟化恶意代码防护系统
个人产品讨论区
瑞星之剑
瑞星防病毒安全软件
瑞星杀毒软件
瑞星个人防火墙V16
瑞星AI网络威胁检测引擎、威胁情报及网安知识图谱
瑞星其他产品
技术交流区
反病毒/反流氓软件论坛
可疑文件交流
恶意网站交流
入侵防御(HIPS)
系统软件
硬件交流
综合娱乐区
Rising茶馆
影音贴图
瑞星安全游戏
活动专区
本站站务区
站务
待审核
瑞星“1+2”全新解决方案巡展在广州画上圆满句号
叶院长揭秘:瑞星如何运用AI技术革新网络安全
俄乌冲突加剧网络攻击风险 白俄罗斯政府遭APT攻击
瑞星ESM防病毒系统助力矿业大学筑牢网络安全防线
实力拉满 瑞星第五十次通过VB100测评
请移步新论坛反馈问题或参与讨论
护航司法,瑞星助力山西省高院构建安全防线
人工智能在网络安全领域的风险和机遇
1
1
/ 1 页
跳转
页
[问题/讨论] 堆和栈的区别
收藏
TrishBoay
初生襁褓狮
帖子:
25
注册:
2010-05-25
来自:
发表于: 2010-07-10 16:08
|
只看楼主
短消息
资料
字号:
小
中
大
1楼
堆和栈的区别
栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区。里面的变量通常是局部变量、函数参数等。
堆,就是那些由
new
分配的内存块,他们的释放编译器不去管,由我们的应用程序去控制,一般一个
new
就要对应一个
delete
。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。
首先,我们举一个例子:
void f() { int* p=new int[5]; }
这条短短的一句话就包含了堆与栈,看到
new
,我们首先就应该想到,我们分配了一块堆内存,那么指针
p
呢?他分配的是一块栈内存,所以这句话的意思就是:在栈内存中存放了一个指向一块堆内存的指针
p
。在程序会先确定在堆中分配内存的大小,然后调用
operator new
分配内存,然后返回这块内存的首地址,放入栈中,他在
VC6
下的汇编代码如下:
00401028 push 14h
0040102A call operator new (00401060)
0040102F add esp,4
00401032 mov dword ptr [ebp-8],eax
00401035 mov eax,dword ptr [ebp-8]
00401038 mov dword ptr [ebp-4],eax
这里,我们为了简单并没有释放内存,那么该怎么去释放呢?是
delete p
么?澳,错了,应该是
delete []p
,这是为了告诉编译器:我删除的是一个数组
好了,我们回到我们的主题:堆和栈究竟有什么区别?
主要的区别由以下几点:
1
、管理方式不同;
2
、空间大小不同;
3
、能否产生碎片不同;
4
、生长方向不同;
5
、分配方式不同;
管理方式:对于栈来讲,是由编译器自动管理,无需我们手工控制;对于堆来说,释放工作由程序员控制,容易产生
memory leak
。
空间大小:一般来讲在
32
位系统下,堆内存可以达到
4G
的空间,从这个角度来看堆内存几乎是没有什么限制的。但是对于栈来讲,一般都是有一定的空间大小的,例如,在
VC6
下面,默认的栈空间大小是
1M
(好像是,记不清楚了)。
碎片问题:对于堆来讲,频繁的
new/delete
势必会造成内存空间的不连续,从而造成大量的碎片,使程序效率降低。对于栈来讲,则不会存在这个问题,因为栈是先进后出的队列,他们是如此的一一对应,以至于永远都不可能有一个内存块从栈中间弹出,在他弹出之前,在他上面的后进的栈内容已经被弹出,详细的可以参考数据结构,这里我们就不再一一讨论了。
生长方向:对于堆来讲,生长方向是向上的,也就是向着内存地址增加的方向;对于栈来讲,它的生长方向是向下的,是向着内存地址减小的方向增长。
分配方式:堆都是动态分配的,没有静态分配的堆。栈有
2
种分配方式:静态分配和动态分配。静态分配是编译器完成的,比如局部变量的分配。动态分配由
alloca
函数进行分配,但是栈的动态分配和堆是不同的,他的动态分配是由编译器进行释放,无需我们手工实现。
用户系统信息:Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727)
分享到:
短消息
资料
加为好友
全部帖子
性别:
精华:
0
威望:
50
贡献:
0
金钱:
0
状态:
离线
等级:
TrishBoay
初生襁褓狮
帖子:
25
注册:
2010-05-25
来自:
发表于: 2010-07-10 16:16
|
只看楼主
短消息
资料
字号:
小
中
大
2楼
回复: 堆和栈的区别
另外,在函数调用的时候,首先进栈的是下一条指令,接着是函数的参数,在大多数的C编译器中,参数的入栈顺序是从右向左的.接下来是被调用函数中的局部变量,注意全局变量是不入栈的.
函数返回的时候,首先出栈的是局部变量,然后是函数的参数,最后出栈的是主函数中的下一条指令,这样就保证了主函数在调用完成后能够继续的执行下去.
短消息
资料
加为好友
全部帖子
性别:
精华:
0
威望:
50
贡献:
0
金钱:
0
状态:
离线
等级:
迷失の坏坏
强壮不惑狮
帖子:
1174
注册:
2009-06-10
来自:
火星【兔子家族】
发表于: 2010-07-10 16:35
|
短消息
资料
字号:
小
中
大
3楼
回复:堆和栈的区别
感谢TrishBoay 童鞋分享知识
随风飘扬叶迷失——缘也命也勿强求,杨叶誓以风迷失
┆少┆┆姩┆┆輕┆┆誑┆
短消息
资料
加为好友
全部帖子
性别:
生日:
1999-9-21
精华:
0
威望:
1817
贡献:
264
金钱:
0
状态:
离线
等级:
shenxx1989
拙长孩提狮
帖子:
88
注册:
2009-01-20
来自:
发表于: 2010-07-10 22:11
|
短消息
资料
字号:
小
中
大
4楼
回复:堆和栈的区别
上完软件基础我就记住了个
堆是先进先出。栈是后进先出。
呵呵。。。
短消息
资料
加为好友
全部帖子
性别:
精华:
0
威望:
164
贡献:
1
金钱:
0
状态:
离线
等级:
springyun
拙长孩提狮
帖子:
128
注册:
2010-05-20
来自:
发表于: 2010-07-11 08:02
|
短消息
资料
字号:
小
中
大
5楼
回复:堆和栈的区别
呵呵,都已经忘光了,谢谢分享!
短消息
资料
加为好友
全部帖子
性别:
精华:
0
威望:
248
贡献:
0
金钱:
0
879836890
状态:
离线
等级:
西南偏南
初生襁褓狮
帖子:
218
注册:
2010-06-09
来自:
籍贯河北 现居成都
发表于: 2010-07-11 13:05
|
短消息
资料
字号:
小
中
大
6楼
回复:堆和栈的区别
必须学习~!
一闪一闪亮晶晶,漫天都是小星星
短消息
资料
加为好友
全部帖子
性别:
生日:
1989-10-16
精华:
0
威望:
345
贡献:
63
金钱:
0
无
516559101
状态:
离线
等级:
鹰丶风少
自信弱冠狮
帖子:
323
注册:
2010-05-05
来自:
【皮皮的忠实粉丝】
发表于: 2010-07-13 12:11
|
短消息
资料
字号:
小
中
大
7楼
回复:堆和栈的区别
兵团。。。
短消息
资料
加为好友
全部帖子
性别:
精华:
0
威望:
647
贡献:
0
金钱:
0
171440133
状态:
离线
等级:
念初
强壮不惑狮
帖子:
1021
注册:
2005-07-03
来自:
病毒大染缸
发表于: 2010-07-13 18:06
|
短消息
资料
字号:
小
中
大
8楼
回复:堆和栈的区别
这期实习的同窗们有多少是计算机专业的??
感染不是你的错
不能修复就是你的不对了
遇到问题请附截图和sreng日志
短消息
资料
加为好友
全部帖子
性别:
生日:
1988-5-26
精华:
0
威望:
1723
贡献:
276
金钱:
0
hw2619@qq.com
29948114
状态:
离线
等级:
<<
上一主题
|
下一主题
>>
1
1
/ 1 页
跳转
页
论坛跳转...
企业产品讨论区
瑞星安全云终端软件
瑞星ESM防病毒终端安全防护系统
瑞星杀毒软件网络版(含Linux)
北方区
华东区
华南区
木马入侵拦截有奖体验专区
瑞星2009版查杀引擎测试
瑞星2009测试版问题反馈
瑞星杀毒软件2009公测
瑞星个人防火墙2009公测
瑞星全功能安全软件2009公测
瑞星智能沙箱分析/恶意代码威胁监测分析/上网行为管理
瑞星防毒墙5.0、瑞星下一代防火墙
瑞星虚拟化恶意代码防护系统
个人产品讨论区
瑞星之剑
瑞星防病毒安全软件
瑞星杀毒软件
瑞星安全联盟论坛
瑞星杀毒软件V16+
V16+新引擎测试专区
瑞星全功能安全软件
瑞星杀毒软件2011
瑞星个人防火墙V16
广告过滤
瑞星个人防火墙2011
瑞星AI网络威胁检测引擎、威胁情报及网安知识图谱
瑞星其他产品
瑞星手机安全助手
瑞星路由安全卫士
路由系统内核漏洞
APP保镖
瑞星安全浏览器
瑞星安全助手
卡卡上网安全助手
瑞星软件管家
瑞星加密盘
账号保险柜5.0
瑞星专业数据恢复
技术交流区
反病毒/反流氓软件论坛
菜鸟学堂
安全技术讨论
可疑文件交流
恶意网站交流
瑞星云安全网站联盟专版
每日网马播报
入侵防御(HIPS)
系统软件
硬件交流
综合娱乐区
Rising茶馆
影音贴图
瑞星安全游戏
凡人修真
华人德州扑克
一球成名
星际世界
神仙道
赢家竞技
梦幻飞仙
三国演义
仙落凡尘
秦美人
攻城掠地
女神联盟
风云无双
傲视九重天
深渊
魅影传说
热血屠龙
雷霆之怒
大天使之剑
传奇霸业
无上神兵
斗破沙城
全民裁决
蛮荒之怒2
活动专区
瑞星积分商城
实习生专区
实习生交流区
实习生签到区
实习生考核区
“安全之狮”校园行活动专版
历史活动
论坛9周年活动专区
关注灾情 同心抗灾
本站站务区
站务
版主之家[限]
禁言禁访记录
待审核
瑞星客户俱乐部[限]
瑞星杀毒软件V17的个人介绍 by dg1vg4
瑞星发布《等保2.0详解暨瑞星等保三级解决方案》
遇密锁病毒CTB-locker 文档被加密,咨询如何解密/恢复的请进
连续13年!瑞星安全软件入选央采项目
还是给SIM卡设个PIN码吧 by baohe
瑞星杀毒软件V17的个人介绍 by dg1vg4
遇密锁病毒CTB-locker 文档被加密,咨询如何解密/恢复的请进
招贤纳士 网罗人才——瑞星网安欢迎您的加入
我的主题
我的帖子
我的精华
我的好友
文本模式