我编了一个很大的程序,大概有几万行吧,里面开了六七个线程。
这个程序短时间里运行还比较正常,但是长时间运行,如两天后,程序当执行某一个功能就会不响应了。还有一个现象,就是,如果退出这个程序,系统会退很长时间(硬盘响很长时间),在这段时间里,你无法把新的程序覆盖到原来的这个程序上(好像程序没有完全退干净),只有等程序完全退干净后,你才可以覆盖。
另,我查了一下任务管理器,发现长时间运行后的“页面错误”有很多。(不过我看瑞星的RavMon.exe更多),不知道和这个有没有关系。
还有一个可以想到的方面不知道是不是,就是在程序里面用了很多CString类,会不会是导致这个问题的原因(因为我看到有的文章说CString可能导致内存泄露)?如果不是的话,应该怎么查呢?
敬请大家给以指导。

解决方案 »

  1.   

    这种问题,你可以用BoundsChecker检查一下,但是那玩意也不一定很准。
      

  2.   

    没释放的都是线程里的内核句柄吗?补充一点还有就是那些资源的句柄,比如CGdiObject的派生的对象句柄,选入当前CDC使用完后如果没有恢复并释放该句柄,时间长了可就要崩溃了,而且根本没办法查出来是哪个CGdiObject的句柄没释放。
      

  3.   

    把你的程序运行在vc6的debug模式下,关程序时,看看debug栏在哪里报出memory leak信息,多半是你没有释放内存,大量的loop造成的。
    硬盘长亮,是因为,当你的物理内存不路时,你的进程就开始动用了虚存,也就是硬盘,当它们总数到达4gb时,就当机了。当机后,系统要还原这堆内存,所以你的硬盘正在做删除处理。祝你好运~~
      

  4.   

    CString是有可能导致内存泄露的,比如你没有ReleaseBuffer
    这样的情况下,boundchecker有时检查不出来的,还有就是有没有画图的程序,没有选回原来画笔,画刷什么的
    还有没有句柄没有关闭的,没有访问注册表时没有关闭的
      

  5.   

    CString,Getbuffer()完后然后当然要ReleaseBuffer了,楼主说的CString会造成内存泄露就是指这个吗?要是那样那可是程序员自己的问题了,怎么能怪的着CString呢!
    还有类似画笔,画刷,位图这样的资源句柄有时释放的时机要恰倒好处,有时不是当时使用完就马上释放,还要考虑自己程序里当前CDC环境的生命作用周期,如果使用完马上释放,CDC环境改,有时程序的功能可能会出问题,只能等到最后某个时候来释放,所以才会出现放到后来忘记释放或释放不全的问题!