0

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

3 に答える 3

4

メモリリークはどこで見られますか? 動的割り当てはなく、ポインター操作もありません。動的に割り当てられたメモリへのmemsetポインターを上書きすると、メモリリークが発生する可能性がありますが、 にはポインターがなくBITMAPINFOHEADER、整数のみです。

于 2012-04-27T07:37:21.023 に答える
2

この場合、 はオブジェクトをゼロでmemset埋めます。bmihしたがって、メモリリークはありません。

このFillBitmapInfoメソッドは、BITMAPINFO以前に別の場所に割り当てられたオブジェクトへのポインターを使用して呼び出されます。構造体のメンバーbmihへの単なる参照です。によって参照されるメモリ領域に値を割り当てるだけです。bmiHeaderBITMAPINFOmemsetbmih

于 2012-04-27T07:33:14.020 に答える
2

Amemset()はメモリ リークを引き起こしません。が指すメモリの一部に 0x00 バイトを書き込むだけbmiです。ここには、メモリ リークが発生しているかどうかを判断するための十分なコードがありません。

于 2012-04-27T07:33:24.793 に答える