procexp.exe来监视gdi对象是不是泄漏!

解决方案 »

  1.   

    将CBitMap add(CImageList::add)至CImageList,调用DeleteObject(),然后将CImageList SetImageList(CListCtrl::SetImageList)至CListCtrl,对CImageList进行DeleteImageList(CImageList::DeleteImageList),但是列表的图标仍然显示正常的,感觉很怪异呀~哪位大牛能不能帮忙解释一下吗???是不是我可以理解为CImageList::add、CListCtrl::SetImageList都其实加入的是副本?  
    还是说DeleteObject、DeleteImageList不是我们通常以为的delete资源释放?
      

  2.   

    有人帮忙回答没?
    是不是我可以将加载CBitMap的GDI句柄理解为类似于tr1::shared_ptr的东西,当所有指向该bitmap的GDI都被delete之后,CBitMap加载的图片的内存就被释放掉了?   但是在调试中遇到的也不对呀,CImageList::add的时候也没有见GDI句柄值的增加。哪位高手指点下吧~~~真心不懂呀
      

  3.   

    是的你是释放了,但是你没有保存下来原来的,所以才导致你的这个问题。把原来的句柄保存下来,delete完了,再选 回去就行了。
      

  4.   


    我想是我没有表达清楚,我的问题是:CBitMap对象load之后,调用CImageList::add,再deleteObject(),为什么这个图片还能正常显示?我把CImageList 对象通过CListCtrl::SetImageList设置进CListCtrl,调用CImageList::DeleteImageList为什么CListCtrl还能正常显示这些图片的信息?
      

  5.   

    检查是否资源泄漏的办法之一:
    在任务管理器 进程 查看 选择列 里面选择:内存使用、虚拟内存大小、句柄数、线程数、USER对象、GDI对象
    让你的程序(进程)不退出,循环执行主流程很多遍,越多越好,比如1000000次甚至无限循环,记录以上各数值,再隔至少一小时,越长越好,比如一个月,再记录以上各数值。如果以上两组数值的差较大或随时间流逝不断增加,则铁定有对应资源的资源泄漏!