2016-07-29 24 views
3

このHDCメモリリークに問題があります。 HDCを正しくリリース/削除しているかどうかを確認できますか?HDCメモリリーク(HDCのリリース/ hdcの削除)

ありがとうございました!私はdeleakersでチェックし、私はことが判明

BITMAP bm; 
HBITMAP hbmap; 
HBITMAP hBitmapOld; 
BITMAPINFO bmi; 
HDC hdcShot; 

...

while(true) 
{ 
    if (!TakeScreenshot(GameWindow, bm, hbmap, bmi, hdcShot, hBitmapOld, appWnd)) 
        break; 

     HBITMAP hbmapNew = CreateCompatibleBitmap(hdcShot, rcWindow.right - rcWindow.left, rcWindow.bottom - rcWindow.top); 

     HDC hdcShotNew = CreateCompatibleDC(hdcShot); 

     HBITMAP OldBmp = (HBITMAP)SelectObject(hdcShotNew, hbmapNew); 


     BitBlt(hdcShotNew, 0, 0, rcWindow.right - rcWindow.left/*Window WIDTH*/, rcWindow.bottom - rcWindow.top/*Window HEIGHT*/ 
      , hdcShot, 0, 0, SRCCOPY); 


     pPixels = new RGBQUAD[bm.bmWidth * bm.bmHeight]; 
     if (!pPixels) return false; 

     SelectObject(hdcShotNew, OldBmp); 


     if (!GetDIBits(hdcShotNew, hbmapNew, 0, bm.bmHeight, pPixels, &bmi, DIB_RGB_COLORS)) 
     { 
      DeleteDC(hdcShot); 
      delete[] pPixels; 

      return false; 
     } 



// dont mind about this 
     ScanContents scanContentsMain(bm, rcWindow, pPixels); 
// dont mind about this 
     ScanBMPHorizontal(&scanContentsMain); 




     //free memory - I might have cleared the memory incorrectly here! Please check! 
     free(pPixels); 
     SelectObject(hdcShot, hBitmapOld); 
       DeleteDC(hdcShot); 
       DeleteObject(hbmapNew); 
       DeleteDC(hdcShotNew); 
} 

TakeScreenShotのFunc(本当に重要ではないが、それはいくつかの変数が初期化されている方法を示しています)

bool TakeScreenshot(std::string WindowToFind, BITMAP &bm, HBITMAP &hbmap, BITMAPINFO &bmi, HDC &hdcShot, HBITMAP &hBitmapOld, HWND &hwnd) 
{ 
    RECT rc; 
    GetWindowRect(hwnd, &rc); 
    hdcShot = CreateCompatibleDC(0); 
    hbmap = CreateCompatibleBitmap(GetDC(0), rc.right - rc.left/*Window WIDTH*/, rc.bottom - rc.top/*Window HEIGHT*/); 

    SelectObject(hdcShot, hbmap); 


    BitBlt(hdcShot, 0, 0, rc.right - rc.left/*Window WIDTH*/, rc.bottom - rc.top/*Window HEIGHT*/ 
     , GetDC(0), rc.left, rc.top, SRCCOPY); 

//Ignore this 
    if (!GetObject(hbmap, sizeof(BITMAP), (LPSTR)&bm)) 
     return false; 
    int bitsPerPixel = bm.bmBitsPixel; 


//Ignore this 
    if (bitsPerPixel != 32 || bm.bmPlanes != 1) 
     return false; 

//Don't mind about this too much 
    SetupBitmapInfo(bmi, bm.bmWidth, bm.bmHeight, bitsPerPixel); 


    return true; 

} 

HDC漏れに苦しんでいる。私は何が間違っているのか分かりません。

+0

delete[]pPixels

変更これでfree(pPixels)を交換してください。これは初期化されていない変数を削除し、初期化されていないオブジェクトをDCに選択し、削除されていないと思われる他のオブジェクトを削除します。このコードはまったく機能しますか? –

+0

です。これは完全なソースコードの一部にすぎません。それは実際にはかなりうまくいく。漏れたメモリのちょっとしたことは、時間がたつにつれて合計されます。 – user3518291

+0

@BarmakShemirani私の自由な記憶機能を見てください。私はメモリを間違って解放したかもしれないと思う。 [Added TakeScreenShot function] – user3518291

答えて

4

あなたはここにリソースリークを持っています。(それはまだこのような場合にはクリーンアップが)あなたは

HDC hdc = GetDC(0); 
CreateCompatibleBitmap(hdc, rc.right - rc.left, rc.bottom - rc.top); 
... 
ReleaseDC(0, hdc);//call this before exiting the function 

free(pPixels)に変更する必要があります

hbmap = CreateCompatibleBitmap(GetDC(0), rc.right - rc.left, rc.bottom - rc.top); 

は間違っています。これに

SelectObject(hdcShot, hBitmapOld); 
DeleteDC(hdcShot); 
DeleteObject(hbmapNew); 
DeleteDC(hdcShotNew); 

:あなたがランダムに異なる機能を呼び出している

SelectObject(hdcShot, OldBmp); 
DeleteObject(hbmapNew); 
DeleteObject(hBitmapOld); 
DeleteDC(hdcShot); 
DeleteDC(hdcShotNew); 
+0

私はこの答えがそれを要約できると思います。私は明日コンピュータに戻ったときにテストします。ありがとうございました! – user3518291

関連する問題