CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  网络编程

windows内存管理问题,高手请进来,分不是问题

楼主oyangfeng(小马)2004-11-01 11:54:57 在 VC/MFC / 网络编程 提问

各位高人:  
   
  我x86pc机有128M内存,使用windows2000服务器  
   
  1、程序中能使用的空间和ram是什么关系?一个应用程序(进程)的堆栈能有多大?(默认)?  
   
  2、我可不可以使用   new   来开辟一块200M的空间?  
  如果可以,这块空间分配在那里?  
  如果不可以,为什么?  
   
  3、线程的有没有自己的堆?,在该线程中执行new   分配的空间在那里?  
   
  4、virtualalloc()分配一块虚内存(提交物理存储器)后这块内存在不在ram里?  
   
  5、所谓的页文件究竟是指什么?  
  问题点数:20、回复次数:13Top

1 楼rwdx(忆)回复于 2004-11-01 12:09:06 得分 0

1,进程使用空间是虚拟的,ram指物理内存吧,   进程默认堆栈好像是1MB  
  2,可以,分配的内存为虚拟内存,可能在物理内存里面也可能在分页文件里面  
  3,有,线程默认堆  
  4,不一定在,  
  5,内存交换文件,  
  Top

2 楼oyangfeng(小马)回复于 2004-11-01 12:53:32 得分 0

谢谢,c++里的new   分配一次内存是直接在进程的默认堆里分配还是新创建一个堆?  
  在线程里使用new   是使用进程的默认堆,自己的堆,还是新创建一个堆?  
  请您以及其他高人赐教!Top

3 楼oyangfeng(小马)回复于 2004-11-01 16:59:13 得分 0

我可以加分,只要能追求真理。  
  自己upTop

4 楼cryptonym(想裸睡)回复于 2004-11-01 17:19:59 得分 0

也可以用默认的堆,也可以自己HeapCreate()创建堆出来用。Top

5 楼madhappy(545454)回复于 2004-11-01 17:25:03 得分 0

1   和ram没有直接的关系。和地址线位数有关,因为是32位的所以程序使用的最大地址空间一般为4g。但是在win2000后的版本也可以设置增加。堆栈和进程空间是有区别的,一般新开的堆栈有1兆的样子。  
   
  2   如果空间够用就可以。分配在堆内存里面。  
   
  3   线程其实就是一个函数,像主函数一样,主函数时主线程的起始函数。new出来的东西和上面一样,在一起  
   
  4   不在。ram是一个操作区域。当cpu要执行你程序的某端代码时。系统把这段代码放到内存里面。所以virtualalloc()这个代码本身执行时是在ram里面的。他所操作的内存块不在。以后这个内存块要用的时候会被放入内存  
   
  5   为了让硬盘的虚拟内存和内存的存储区域交互,才会出现页式,段式管理。页文件指的还是存储区域。只是被分页以后的而已  
   
  问题都差不多集中在一块。看操作系统的内存管理知识。  
   
     
  Top

6 楼oyangfeng(小马)回复于 2004-11-01 18:34:27 得分 0

果然是高人,不过还没解释c++的new呢?分配内存是直接在进程的默认堆里分配还是新创建一个堆?,进程默认的堆空间不够用时该怎么办呢?  
   
  进程(或线程)的栈什么情况下会溢出呢?Top

7 楼oyangfeng(小马)回复于 2004-11-03 10:33:53 得分 0

自己upTop

8 楼savage54321(野人)回复于 2004-11-03 11:19:53 得分 0

c++中的new是在进程默认的堆中分配内存。一个线程中的堆默认是1M也可以在vc中修改。如果你个喜欢自己管理堆可以重载new操作符,这样可以自己创建和管理堆栈!  
  置于的栈什么情况下会溢出,呵呵,很简单一个无穷的递归调用就可以让栈溢出!Top

9 楼keios(C->C++->java->C 循环中)回复于 2004-11-03 16:06:23 得分 0

rwdx(任我独行之风云再起)说的有一个错误:  
  线程不拥有自己的默认堆,它们共享进程的堆。  
  默认堆是指GetProcessHeap得到的堆,进程中所有线程共享。  
  如果没记错的话,   new   是在默认堆上分配的内存。可以跟踪代码看一下就知道了。Top

10 楼loucai(羽)回复于 2004-11-04 10:02:32 得分 0

upTop

11 楼oyangfeng(小马)回复于 2004-11-04 12:33:36 得分 0

谢谢,不过keios,我想问的是,在vc6.0下,写这样的语句char   *p=new   char[200*1024*1024];是可以执行的阿?请问这个new是用默认堆栈吗?默认堆栈可是只有1m?Top

12 楼keios(C->C++->java->C 循环中)回复于 2004-11-04 17:50:30 得分 20

可能有些名词有所误解。  
  一般要说堆栈,指的是栈(stack)。单说堆,指的是heap   。  
  stack是每个线程拥有一个,至于大小是不是1M,在编译和创建线程时可以指定。  
  new   操作符,malloc,   HeapAlloc   ,分配的内存都在堆(heap)上,  
  heap   的地址空间大小只受你机器寄存器位数的限制,32位机器上就是4G(当然windows会保留部分)。  
  而当物理内存不够用时,windows会使用磁盘作为虚拟内存,stack和heap都可能被放入虚拟内存。  
  因此   new   char[200*1024*1024]   是可以执行的。  
   
  如果你想详细知道windows是如何处理物理内存和虚拟内存之间关系的,  
  最好看看80386保护模式的内存机制,  
  明白CPU是如何提供这样的机制,你就明白windows是怎么实现的了。Top

13 楼oyangfeng(小马)回复于 2004-11-05 09:36:18 得分 0

:   keios(C->C++->java->C   循环中)我佩服!  
  有msn吗?收我做徒弟吧!Top

相关问题

  • 内存管理的问题,请进来发言!
  • 用过windows 2000(sp3)请进来?
  • 熟悉医院管理系统的高手请进来:)
  • 做过酒店管理的朋友请进来看看
  • ^_^请进来讨论一下“零内存保存”问题?解决便给分^_^
  • 看过《windows程序设计》的朋友请进来!
  • 帮忙,送分啦!(对windows 熟悉的请进来!)
  • WINDOWS右键中WINZIP、ICQ等如何去除,请进来看看
  • 一个普遍的windows 的问题,请进来看看
  • jukywen请进来....

关键词

  • c++
  • 内存
  • 线程
  • 函数
  • 虚拟
  • 物理
  • 代码
  • 执行
  • 管理
  • 文件

得分解答快速导航

  • 帖主:oyangfeng
  • keios

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo