看了以前的文章,提到建一个内存dc,把绘图工作在上面完成然后在ONDRAW里BITBLT到PDC上.这个方法不错,但有些地方还是不很清楚.比如我有个视图类,我加上一个成员变量 CDC m_dc,在初始化时SELECT一个CBITMAP对象,在ONDRAW里只调用一个BITBLT函数.问题就在于在没有用成员变量的例子里,这个CBITMAP对象在完成绘图后要通过 m_dc.selectobject(oldbmp),然后再DELETE掉,而像这种m_dc做成员变量的情况下应该如何把CBITMAP给弄掉呢.我对类似这种CDC内存泻漏问题的认识还不很清楚,希望能有大虾帮讲解一下

解决方案 »

  1.   

    Detected memory leaks!
    Dumping objects ->
    d:\_private\myoffice\vc\test\platewndtest\platewndtest.cpp(52) : {58} normal block at 0x00344BB0, 1 bytes long.
     Data: < > CD 
    Object dump complete.如果在debug模式下运行程序时debug窗口中出现了类似上面的信息,那就证明有内存泄露,否则就没有。
      

  2.   

    非也
    debug只能检测到很少一部分
    更多的内存泄露责需要外部工具去检测,
    具体的让后面的人补充 ^-^
      

  3.   

    同意楼上的,比如GDI句柄的内存泄漏就只有外部工具才能看出来。
      

  4.   

    好像内存DC的绘图区域决定于它SELECT的CBITMAP对象大小,下面这段代码我放在OnEraseBkgnd(CDC* pDC)里,m_dc是用pDC创建的内存DC,temp_bmp是大小等于GetClientRect的位图,我想把它选进m_dc,把原来的DELETE掉.编译运行都能通过,没有报错         RECT rc;
    GetClientRect(&rc); CBitmap temp_bmp;
    temp_bmp.CreateCompatibleBitmap(pDC,rc.right,rc.bottom);
    CBitmap *old=m_dc.SelectObject(&temp_bmp);
    m_dc.FillSolidRect(0,0,rc.right,rc.bottom,RGB(0,0,255)); old->DeleteObject(); //这里有没有问题?我搞不清CDC内部到底是什么样的,选进去的对象跟整体是什么关系,为什么最后一定要把旧的选回去?像上面那样不选回去会有什么问题吗?
    还有这个,MSDN里关于GETDC()的说明Unless the device context belongs to a window class, the ReleaseDC member function must be called to release the context after painting. 那我用memDC.CreateCompatibleDC(GetDC()); 还需不需要用REALESEDC()?