社区
进程/线程/DLL
帖子详情
关于堆内存和栈内存
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
打赏
收藏
关于堆内存和栈内存
1.全局变量 ,不关是值类型(int , double)还是引用类型(自己写类) 都是堆上的?static 修饰的全局变量呢? 2.static 修饰的函数内部的局部变量呢? 3.class * a =new A();中 a这个指针应该在栈中吧? 4.vc中堆内存为什么可以大到好多G?进程用户空间不就2G么?莫非堆和单个进程无关?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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修改的局部变量在栈中。
堆空间不可能大于进程地址空间。
堆内存
和
栈内存
的区别
堆内存
和
栈内存
的区别如下: 1、定义不同
堆内存
是区别于栈区、全局数据区和代码区的另一个内存区域。堆允许程序在运行时动态地申请某个大小的内存空间。
栈内存
在函数中定义的一些基本类型的变量和对象的引用变量都...
关于
堆内存
和
栈内存
释放
js 中的内存分为
堆内存
和
栈内存
堆内存
:存储引用类型值 (对象:键值对 函数:代码字符串)
栈内存
: 提供JS代码执行的环境和存储基本类型值
堆内存
释放 让所有引用
堆内存
空间地址的变量赋值给Null 即可 (没有...
堆内存
和
栈内存
这两个术语虽然只有一字之差,但是所表达的意义还是有差别的,
堆内存
和
栈内存
的区别可以用如下的比喻来看出:使用
堆内存
就象是自己动手做喜欢吃的菜肴,比较麻烦,但是比较符合自己的口味,而且自由度大。使用
栈内存
...
java
堆内存
和
栈内存
的区别
一段时间之前,我写了两篇文章文章分别是Java的垃圾回收和Java的值传递,从那之后我收到了很多要求解释Java
堆内存
和
栈内存
的邮件,并且要求解释他们的异同点。在Java中你会看到很多堆和
栈内存
的引用,JavaEE书和文章...
java
堆内存
和
栈内存
的区别_java中
栈内存
和
堆内存
有什么区别
栈内存
和
堆内存
的区别:1、
栈内存
用来存放基本类型的变量和引用变量,
堆内存
用来存储java中的对象,无论是成员变量,局部变量,还是类变量,他们指向的对象都存储在
堆内存
中。(视频教程推荐:java视频)2、
栈内存
归属...
进程/线程/DLL
15,471
社区成员
49,182
社区内容
发帖
与我相关
我的任务
进程/线程/DLL
VC/MFC 进程/线程/DLL
复制链接
扫一扫
分享
社区描述
VC/MFC 进程/线程/DLL
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章