CDmistImageApp* ptoApp=(CDmistImageApp*)AfxGetApp();hwnd=GetDlgItem(IDC_PREPIC2);
hDesDC = hwnd->GetDC()->m_hDC;
hSrcDC = CreateCompatibleDC(hDesDC);hBitmap=(HBITMAP)LoadImage(AfxGetInstanceHandle(),"file    name",IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);if(hBitmap!=NULL)
{
GetObject(hBitmap, sizeof BITMAP, &bm);
SelectObject(hSrcDC, hBitmap);

hwnd->GetClientRect(&rect);
::SetStretchBltMode(hDesDC,COLORONCOLOR);       
::StretchBlt(hDesDC, rect.left, rect.top, rect.right, rect.bottom, hSrcDC, 0, 0, bm.bmWidth, bm.bmHeight,+SRCCOPY);
}
针对如上代码,为了防止内存泄漏我添加了
ReleaseDC(&dc);
ptoApp=NULL;
    hwnd=NULL;
::ReleaseDC(NULL,hDesDC);
::ReleaseDC(NULL,hSrcDC);
但怎么还有泄漏。
我不知道HBITMAP之类的句柄怎么释放?
我该如何释放上面的GDI之类的资源呢?虚心求教。

解决方案 »

  1.   

    BOOL DeleteObject(
      HGDIOBJ hObject   // handle to graphic object
    );你要用这个将HBITMAP之类的句柄释放
      

  2.   

    同意  flyelf(空谷清音) 的。
      

  3.   

    hwnd=GetDlgItem(IDC_PREPIC2);这句怎么释放呢?DEBUG老是提示IMPLEMENT_DYNCREATE(CLeftDialog1, CDialog)这句有泄漏。后来我装了BOUNDSCHECK,倒好,DEBUG不显示泄漏了,BOUNDSCHECK检测不到这里有泄漏。哪位能将点内存泄漏的知识吗?求教:)
      

  4.   

    一个小小的提议:
    我搜索了CSDN的帖子,发现有很多关于内存泄漏的帖子,但都就某一个方面,能不能
    大家都说点经验列在下面,然后对所有人,尤其是刚入门的兄弟,都会有点帮助。我把从别的帖子收到的几点拷在下面1、分配空间要和释放空间对应,例如在程序中有几个new就应该对应几个delete
    2、定义大小固定的数组时尽量将下标设置的大一些,防止缓冲区溢出
    3、最好将分配内存空间的操作放在类的构造函数中,把释放内存空间的操作放在析构函数中,这样当类的对象的生命期结束的时候会自动释放资源
    4、定义指针的时候,最好是定义完之后就初始化,使用完指针之后要将指针设置为NULL
      

  5.   


    博客的一篇文章里的,内存泄漏在被动态分配的内存没有被释放时产生。有许多情况会导致内存泄漏,如没有在程序的全部执行路径中释放内存,没有在析构函数中释放所有的内存等。一个程序在崩溃之前可运行的时间越长,则导致崩溃的原因与内存泄漏的关系越大。   Windows会在程序结束的时候将泄漏的内存收回,因此内存泄漏是个暂时性的问题。但为什么必须消除内存泄露呢?首先,内存泄漏往往会导致系统资源的泄漏。动态分配内存往往不仅仅代表一块存储区域,还代表了某些类型的系统资源,如文件、窗口、设备上下文、GDI对象等。其次,高质量的程序和特定的服务器程序必须能够无限地运行下去。最后,内存泄漏往往是其他程序错误或不良编程习惯的征兆。   导致内参泄漏的原因:忘记释放内存;构造函数失败;存在内存泄漏的析构函数;存在内存泄漏的异常处理程序;多个返回语句;使用错误形式的delete。 
      

  6.   


    hwnd=GetDlgItem(IDC_PREPIC2);//这里得到的不是句柄
    //CWnd *pWnd=
    hDesDC = hwnd->GetDC()->m_hDC; GetObject(hBitmap, sizeof BITMAP, &bm);
    HBITMAP hOldBmp = SelectObject(hSrcDC, hBitmap);

    hwnd->GetClientRect(&rect);
    ::SetStretchBltMode(hDesDC,COLORONCOLOR);       
    ::StretchBlt(hDesDC, rect.left, rect.top, rect.right, rect.bottom, hSrcDC, 0, 0, bm.bmWidth, bm.bmHeight,SRCCOPY);
             ::SelectObject(hOldBmp);
             ::DeleteObject(hBitmap);
    ::DeleteDC(hSrcDC);
    ::ReleaseDC(pWnd->m_hWnd,hDesDC);
      

  7.   

    系统的资源用delete函数释放,程序自己new的资源用delete释放。