我的程序是监控图形曲线程序,从串口不断收取数据并将这些数据绘画成曲线,开始两、三个小时不见有问题但过后的5小时后就出现如题的情况,VIEW里的中文文字变成了乱码,图形不再刷新,TOOLTIP背景色变成了白色而且不自动消失。1 请问这是不是GDI资源泄漏??
2 用BC检测时提示了泄漏,但如何得知是发生在哪行代码??
3 我已检查了几篇绘图部份的代码觉得该DELETE的OBJECT都DELETE了,请问这类型泄漏还有哪些常见的情况??
4 请问内存照片是否也可以检测出GDI泄漏??如何做??谢谢了!!!

解决方案 »

  1.   

    估计是资源被耗尽,你用任务管理器查看一下你程序占用的资源,以及机器当前的CPU内存总的占用情况.
      

  2.   

    你用debug执行一遍(最好能覆盖大部分程序),然后关闭应用程序,看看debug窗口有没有leak报告。有的话可以定位。
    另外,你在绘图中是否有在循环中申请资源的操作,这也会导致资源耗尽。
      

  3.   

    我觉得恐怕是你申请了GDI资源可能有泄漏
      

  4.   

    很有可能是GDI在Timer中申请了,我上次也是,一段时间我的控件还要另外变一个颜色,后来我估计是GDI占用太多,删除了Timer,呵呵一切OK
      

  5.   

    楼主的程序里有没有用到GetDC()/GetWindowDC()?
    如果有,则必须用ReleaseDC()释放资源。比如:void Draw()
    {
        CDC* pDC = GetDC();
        ......
        ReleaseDC( pDC );
    }
      

  6.   

    应该是gdi的资源不足造成
    dc是耗费内存很大,估计很快内存就耗光了
    不容易注意到的是HBRUSH如果有创建而不释放的话也容易造成这种情况另外一种情况是释放不成功
    SelectObject后由于没有选回原来的gdi对象造成dc占有资源而无法释放
    建议写法规范话,选择资源(SelectObject)后,
    使用完一定要选回再释放选入的gdi对象
      

  7.   

    谢谢大家!!!
    happyparrot(快乐鹦鹉): 好像DEBUG里只能看NEW/DELETE的泄漏,而GDI的泄漏却看不到的。dhbo(每天进步1%) : 是的,在TIMER中有申请了GDI,因为是实时的绘图,所以绘图函数是在TIMER里做的,但只要这些函数及时释放资源不是可以了吗?问题是有没有在哪里隐蔽地申请了但自己又不知道释放?LendyZhang(Lendy) :在我的代码里没有用到GetDC()函数,在搜索旧贴里我也得知这个函数是会申请资源的,不过我用了GetSafeDC()不知这个是否会有影响?
      

  8.   

    明显的GDI资源泄漏问题.
    用完资源后应该立即DeleteObject();
    在WIN2000以下操作系统上使用资源后不释放会有内存泄漏。楼主检查一下所有使用GDI资源的地方,把没有释放的资源都释放掉。
      

  9.   

    看Gdi泄漏的一个方法:
    在Task Manager里面,切换到Processes,把Gdi Objects这列显示出来,看看你的程序GDI对象的数目是不是越来越高。
      

  10.   

    谢谢大家!!这应该是GDI资源泄漏了。昨天调试了一天,在XP里用任务管理器监视该进程使用情况时,发现无论句柄数还是GDI都一直没变,程序运行稳定,可是到了98/ME就出现这种情况。请问在9X/ME下有没有第三方软件可以像XP里的任务管理器可以看到进程的GDI以及物理内存、虚拟内存的使用情况?本人在网上找了好久也没找到,希望大家能帮帮忙。谢谢了!!!!
      

  11.   

    请问在9X/ME下有没有第三方软件可以像XP里的任务管理器可以看到进程的GDI以及物理内存、虚拟内存的使用情况?本人在网上找了好久也没找到,希望大家能帮帮忙。谢谢!!