2012-04-27 3 views
0

question의 답변은 cv :: Mat 이미지를 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 coul은 메모리 누수의 원인이됩니다. 이 동적으로 할당 된 메모리에 포인터를 겹쳐 쓰지만, BITMAPINFOHEADER에 단지 포인터가 없으므로 정수만 있습니다.

2

memset 다만이 경우 0으로 bmih 객체를 채운다. 따라서 메모리 누출은 없습니다.

FillBitmapInfo 메서드는 이전에 어딘가에 할당 된 BITMAPINFO 개체에 대한 포인터로 호출됩니다. bmihBITMAPINFO 구조체의 bmiHeader 구성원에 대한 참조 일뿐입니다. memsetbmih이 참조하는 메모리 영역에 값을 할당합니다.

2

memset() 메모리 누수가 발생하지 않습니다. 단지 bmi이 가리키는 메모리 부분에 0x00 바이트를 씁니다. 메모리 누출 여부를 판단 할 수있는 충분한 코드가 없습니다.

관련 문제