请教:
1、应用程序一旦运行,windows(或linux,unix)操作系统是怎样为它分配内存的?
2、动态申请一块空间(如new char[12]),这此空间分配在何处?
3、如果应用程序退出了,但没有动态撤销原动态申请的空间,这时该空间是否被操作系统回收?其他应用程序是否可用它?

解决方案 »

  1.   

    我只懂windows,其他不敢说。
    1 操作系统首先创建一个进程内核对象,然后在你的应用程序所指定的基地址加载整个exe文件到内存,因为windows有虚存这个概念,所以一般不会给某个应用程序分配固定的内存数量的。随需而变。2 此块内存分配在栈空间上,也就是一个共享内存区上,对于每个进程来说都有一个这样的栈空间。3 当进程关闭并撤销时,操作系统会自动清空它所关联或占用的内存。
      

  2.   

    首先:推荐一本书:windows核心编程。否则你弄不明白的。下面只大概说一下1.系統給这个进程分配一个4g的进程空间。根据源代码的大小,向物理存储器提交保留一定的实际区域。并通过进程的上下文环境(在进程内核空间内)对这段区域进行管理。比如读写,分配内存。页面交换,地址映射等。事实上,上面说的提交的这段代码空间也不过是执行程序文件的一个映射而已。比如在e盘有个.exe程序,你执行以后。进程空间就会映射到e盘这一块。这之后还会出现变数。2.分配在堆里面,堆是进程中的每个线程特有的数据结构。3.a.操作系统不会,也许以后的操作系统会做到这一点。现在的xp只能做到一半。所以如果用c写程序一定要注意内存泄漏的问题。
      b.也许有些天才程序员可以做到以实现特殊的目的,但是一般来说其它应用程序是用不起来的。
      

  3.   

    樓上朋友一開始說的是對的,呵呵new的東西都是在堆裡面.局部變量放在棧裡面.
      

  4.   

    俺认为:
    1。 应用程序运行后,操作系统给这个进程(是进程哈)分配了地址空间和堆栈。
    2。 new char[12]是分配在逻辑上的进程的地址空间的堆上 
    3。 如果应用程序退出,理论上讲,在它的地址空间上的所有堆栈都要释放,也就是说或许我们不调用delete,操作系统都会帮我们释放,但是实际上如此,谁也不是很清楚 。 但是程序设计者如果能够尽量多的控制自己的程序,那是非常美好的事情 。 在没有撤销前,其它的应用程序应该不能用一孔之见
      

  5.   

    分配内存很复杂,牵扯到各个段分配,系统空间,共享,windows核心编程真的不错,建议学习,也可以看看msdn中的Memory Management部分new一般会在堆上分配,还有其他一些分配方式就不一定了。如VirtualAlloc等,直接保留页,还可以直接操作非分页的物理内存(AWE)好像看到过,应用程序退出后,分配的非核心的资源会被释放,就是隶属于4G进程空间的资源,但像内核对象如果没有释放就不会被系统自动释放。可以验证一下,new很大的空间,不释放,退出,资源会被释放。
      

  6.   

    TO madhappy(545454) :
    俺也发现俺思路怎么乱七八糟的呢,看来还是没有度过状态低蘼期呀,哈哈。
      

  7.   

    windows上1、应用程序一旦运行,windows(或linux,unix)操作系统是怎样为它分配内存的?
    进程运行后,将拥有4GB的内存空间,但只是空间,就是说你可以使用这么大,但是还是要先申请才能用的2、动态申请一块空间(如new char[12]),这此空间分配在何处?
    new分配的内存全部在堆上3、如果应用程序退出了,但没有动态撤销原动态申请的空间,这时该空间是否被操作系统回收?其他应用程序是否可用它?
    进程退出后,该进程拥有的所有资源(用户的或者核心的)将全部被操作系统回收
      

  8.   

    樓上说一定会释放的几位,我相信你们这么说是有你们的理由的。可是至少我遇到过这种情况。当我关闭进程以后。资源管理器仍然有进程标示。后来我发现是程序发生内存泄漏,当纠正bug后上述问题也消失了。这也说明我们不能完全相信系统会释放资源。
      

  9.   

    holyeagle(一杯清茶) 关于系统释放内存的那段我很赞同。
      

  10.   

    谢谢,windows核心编程我一定会仔细学习,但有几位说的"核心的资源"可能不被释放,是什么意思?
      

  11.   

    程序结束后,系统保证回收所有资源.98、NT和2000都会自动回收,但NT和2000做得好一点,效果比较显著。但是再怎么好,都会有漏洞的,特别是对需要长期运行的程序不手工delete掉,能长期得到哪里去。
      

  12.   

    我觉得  rfa(实况狐狸) 说的很不错!
    至于关了程序仍然占用资源那是应为没有将进程关掉!
      

  13.   

    进程退出后,该进程拥有的所有资源(用户的或者核心的)将全部被操作系统回收!!
    这个绝对是肯定的,《windows 核心编程》明确指出了的