2012-04-27 48 views
0

我看到這個question的答案是非常受歡迎的關於如何打印簡歷::墊圖像到MFC應用程序。這會泄漏內存嗎?我怎樣才能防止它?

不過,我想知道是否有內存泄漏呢?或者如果沒有,那怎麼可能?

具體而言,我想了解一下該memset(bmih, 0, sizeof(*bmih))部分。 MFC在某處管理內存嗎?有人可以提供有關這方面的一些信息

void COpenCVTestView::FillBitmapInfo(BITMAPINFO* bmi, int width, int height, int bpp, int origin) 
{ 
assert(bmi && width >= 0 && height >= 0 && (bpp == 8 || bpp == 24 || bpp == 32)); 

BITMAPINFOHEADER* bmih = &(bmi->bmiHeader); 
// this part shouldn't leak? 
memset(bmih, 0, sizeof(*bmih)); 
bmih->biSize = sizeof(BITMAPINFOHEADER); 
bmih->biWidth = width; 
bmih->biHeight = origin ? abs(height) : -abs(height); 
bmih->biPlanes = 1; 
bmih->biBitCount = (unsigned short)bpp; 
bmih->biCompression = BI_RGB; 

if (bpp == 8) 
{ 
    RGBQUAD* palette = bmi->bmiColors; 

      for (int i = 0; i < 256; i++) 
    { 
     palette[i].rgbBlue = palette[i].rgbGreen = palette[i].rgbRed = (BYTE)i; 
     palette[i].rgbReserved = 0; 
    } 
} 
} 

回答

4

你在哪裏看到內存泄漏?沒有動態分配,也沒有指針操作。一個memset庫侖造成內存泄露,如果 覆蓋對動態分配的內存的指針,但沒有 指針在BITMAPINFOHEADER,只是整數。

2

memset只是填充在這種情況下,零點的bmih對象。所以沒有內存泄漏。

FillBitmapInfo方法被調用時指向以前在別處分配過的BITMAPINFO對象。 bmih只是對BITMAPINFO結構的bmiHeader成員的引用。 memset只是給由bmih引用的內存區域分配一個值。

2

memset()不會引起了內存泄漏。這只是將0x00字節寫入bmi指向的部分內存中。這裏沒有足夠的代碼來確定是否有任何內存泄漏。