关于堆内存和栈内存

weidade3621 2009-05-08 12:07:16


1.全局变量 ,不关是值类型(int , double)还是引用类型(自己写类) 都是堆上的?static 修饰的全局变量呢?
2.static 修饰的函数内部的局部变量呢?
3.class * a =new A();中 a这个指针应该在栈中吧?
4.vc中堆内存为什么可以大到好多G?进程用户空间不就2G么?莫非堆和单个进程无关?
...全文
214 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
lyserver 2009-05-08
  • 打赏
  • 举报
回复
在C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。但从汇编的角度看,只有两种,即堆和栈,只不过堆又细分为全局堆和私有堆。
因此,1和2都是堆内存,而且都是全局堆。3为栈内存。
4、这跟操作系统有关,32位的Windows操作系统,最大只能使用3.2G,64位的目前好像最大为128G。
togoblime 2009-05-08
  • 打赏
  • 举报
回复
顶楼上
greatws 2009-05-08
  • 打赏
  • 举报
回复
1、存在全局存储区
2、同1
3、是
4、是2G,很大则可能是其它进程映射的。
AtlasHR 2009-05-08
  • 打赏
  • 举报
回复
1.堆
2.堆
3.栈
4.关注
hxfjb 2009-05-08
  • 打赏
  • 举报
回复
1 未初始化的全局变量在栈上,初始化的全局变量在全局存储区;
static 修饰的全局变量在全局存储区;
2 static 修饰的函数内部的局部变量在全局存储区;
3 class * a =new A();中 a这个指针应该在栈上;
4 使用了内存映射文件。
yanjing_mail 2009-05-08
  • 打赏
  • 举报
回复
学习
nullw 2009-05-08
  • 打赏
  • 举报
回复
与编译器实现有关,不可强求结果
tian_yang_jian 2009-05-08
  • 打赏
  • 举报
回复
6楼介绍得很详细啊
biweilun 2009-05-08
  • 打赏
  • 举报
回复
第4个问题
针对32位系统的庞大数据库映射而言,Windows早发现了这一点,所以它提供了一种成为 地址窗口扩展的机制(Address Windowing Extension),使得32位系统上的应用程序可以申请多达64GB的物理内存,然后将内存视图映射到2GB的虚拟地址空间中
AtlasHR 2009-05-08
  • 打赏
  • 举报
回复
见我的博客,刚刚总结了一下,肯定有帮助!
dashuang2006 2009-05-08
  • 打赏
  • 举报
回复
3.class * a =new A();中 a这个指针应该在栈中吧?

这个是在堆中分配的,,,栈中分配的在程序退出的时候,编译器会自动删除,,这个却无法删除..可以在VC中测试一下..会报内存泄漏..
wutaihua 2009-05-08
  • 打赏
  • 举报
回复
程序分为四个逻辑短:可执行代码、静态数据、动态数据(堆)和栈

1、可执行代码和静态数据存储在固定的内存位置。
2、程序请求动态分配的内存来自于称为堆的内存池。
3、局部数据对象、函数的参数以及调用函数和被调用函数的联系放在称为栈的内存池中

根据操作平台和编译器的不同,堆和栈既可以是被所有同时运行的程序共享的操作系统资源,也可以是使用他们的程序独占的局部资源。

根据以上可以回答:
1、全局变量全部存储在静态存储区中,在程序开始执行时给全局变量分配存储区,程序执行完毕就释放。在程序执行过程中它们占据固定的存储单元,而不是动态的进行分配和释放。
静态变量在程序执行完了清空,就从静态存储区中释放。
2、静态全局变量和静态局部变量存在于程序运行的始终。只是作用域不同。(
(1)静态局部变量在函数内定义,但不象自动变量那样,当调用时就存在,退出函数时就消失。静态局部变量始终存在着,也就是说它的生存期为整个源程序。
  (2)静态局部变量的生存期虽然为整个源程序,但是其作用域仍与自动变量相同,即只能在定义该变量的函数内使用该变量。退出该函数后, 尽管该变量还继续存在,但不能使用它。
  (3)允许对构造类静态局部量赋初值。若未赋以初值,则由系统自动赋以0值。
  (4)对基本类型的静态局部变量若在说明时未赋以初值,则系统自动赋予0值。而对自动变量不赋初值,则其值是不定的。 根据静态局部变量的特点, 可以看出它是一种生存期为整个源程序的量。虽然离开定义它的函数后 不能使用,但如再次调用定义它的函数时,它又可继续使用, 而且保存了前次被调用后留下的值。)

3、Class* A是局部变量指针,所以会存储在栈中,但是其申请的内存属于动态分配的内存,所以存在堆中。
4 我觉得堆的大小分配是由于操作系统的位数有关,32位的要比16位的分配的堆要大,而64位的更大。这跟操作系统分配地址的能力有关。




下面还有一段理论是讲这个问题的
*******************************************
一个由c/C++编译的程序占用的内存分为以下几个部分
********************************************/
1、栈区(stack)—— 由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。

2、堆区(heap)—— 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。

3、全局区(静态区)(static)— 全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放

4、文字常量区 — 常量字符串就是放在这里的。 程序结束后由系统释放

5、程序代码区 — 存放函数体的二进制代码。
oldmanzhao 2009-05-08
  • 打赏
  • 举报
回复
Windows 的应用程序在X86平台一般是只允许访问2GB的地址空间的(2GB用户进程,2GB系统分配),如果要扩大用户地址范围,链接的时候要加上相应的选项
cnzdgs 2009-05-08
  • 打赏
  • 举报
回复
变量的储存空间分为静态区、堆、栈三种类型:用static修饰的变量和全局变量在静态区中;用new分配的变量在堆中;未使用static修改的局部变量在栈中。
堆空间不可能大于进程地址空间。

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧