posts - 58,  comments - 75,  trackbacks - 0
    new出来的空间如果没有主动销毁,在程序退出时仍可能有内存的泄露。
操作系统描述到,在进程退出时会销毁它所使用的所有内存空间,但这只是
一个模型上的构想和描述。在实际的操作系统的实现上并不能做到这一点。
因为,要实现在进程退出时销毁它所使用的内存空间,就要给每个被使用的
内存空间打一个标,表示这段内存空间被那个进程使用。在这种情况下,如
果有多个使用小内存量的进程,并且被频繁的创建和销毁,那么光记住那些
进程标致就要占用很大的内存空间,这是一个很不划算的方案。所以在实际
中,操作系统并没有给每个进程使用的内存空间打标。这样,有些小内存是
没有被回收的,如果多次开关这个程序就会发现,有内存被大量的占用,而
不能被释放。
    所以那些在程序中只有一个实例,并且是被new出来的对象,也应该主动
的去手动销毁,而不能依赖程序退出时由系统销毁。

    被new出来的对象其销毁是两个步骤。
    1 析构对象。条用对象的析构函数,将对象占用的资源释放掉。
    2 释放内存。将对象所占用的内存释放掉。
    
    如果new出来的对象没有被销毁,会造成连个层面上的泄露。
    1 对象泄露。他会造成背对象占用的资源也没有销毁或释放。比如在对象
中占有文件的句柄,在析构时才释放。如果对象泄露了,这个句柄是不会被释
放的。那个文件会一直被占用。如果文件打开时是独占的,那么及时对象所在
的程序退出了,别的程序也别想访问这个文件。
    2 内存泄露。所占用的内存不能被释放。

posted on 2007-05-31 10:50 walkspeed 阅读(2685) 评论(5)  编辑 收藏 引用 所属分类: C++语言

FeedBack:
# re: 内存泄露和对象泄露
2007-05-31 17:58 | Steven
内存在进程结束时是会被释放的
至少windows是这样的。
几乎所有的内存都是从heap上分配的,虽然每个进程可以有多个heap
但不会太多的,系统在进程结束的时候释放所有的heap,自然从heap上
分配的内存也被释放掉了。
当然依赖进程结束来释放内存依然是危险的,因为系统只负责释放内存
而不管调用析构函数,如果析构函数中有什么操作的话是不会被执行的。
不过windows上还好了,进程结束的时候所有进程相关的内核对象和GDI对象
包括文件,mutex, dc等都会被释放掉。

对于某些其他操作系统来说,尤其是嵌入式系统,比较麻烦些。
比如Symbian OS,进程结束后某些资源不会被释放,尤其是发生异常退出的时候。  回复  更多评论
  
# re: 内存泄露和对象泄露
2007-06-01 09:20 | walkspeed
你可以做个小实验。
写一个程序,只是new个几十K的内存。

将这个程序开关,开关几十次,你就会发现内存的后用会增加。如果再多,windows是会挂的。  回复  更多评论
  
# re: 内存泄露和对象泄露
2007-06-01 16:39 | myy
我同意 1 楼的说法.

楼上的小实验并不能说明问题,就算是正常的程序,内存也会增加,我猜这是操作系统内部的原因,比如缓存文件映像什么的。  回复  更多评论
  
# re: 内存泄露和对象泄露
2007-06-01 18:07 | wqp
#1楼说的是对的,现代操作系统都采用虚拟内存来管理物理内存,每个进程拥有的只是线性地址,用来记录线性地址到物理地址转换的页表为每个进程所有,进程退出时,操作系统会释放所有该页表对应的物理内存页。因此,此处不需要担心内存泄漏的问题。而对于服务器程序,由于长时间运行,需要特别注意内存泄漏;还有就是嵌入式OS,通常都是在实模式运行的,也有泄漏的风险。  回复  更多评论
  
# re: 内存泄露和对象泄露
2007-06-04 14:21 | 看图软件
内存泄露。所占用的内存不能被释放,怎么办  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理



<2007年6月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
1234567

常用链接

留言簿(4)

随笔分类(64)

随笔档案(58)

文章分类(3)

文章档案(3)

相册

收藏夹(9)

C++零碎

好友

搜索

  •  

积分与排名

  • 积分 - 159898
  • 排名 - 163

最新评论

阅读排行榜

评论排行榜