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

您在哪里看到内存泄漏?没有动态分配,也没有指针操作。如果 Amemset覆盖了指向动态分配内存的指针,则可能导致内存泄漏,但 a 中没有指针BITMAPINFOHEADER,只有整数。

于 2012-04-27T07:37:21.023 回答
2

在这种情况下,只是用零memset填充对象。bmih所以没有内存泄漏。

使用指向先前分配在其他地方FillBitmapInfo的对象的指针调用该方法。只是对结构成员的引用。只需为 . 引用的内存区域分配一个值。BITMAPINFObmihbmiHeaderBITMAPINFOmemsetbmih

于 2012-04-27T07:33:14.020 回答
2

Amemset()不会导致内存泄漏。这只是将 0x00 字节写入 . 指向的内存的一部分bmi。这里没有足够的代码来确定是否有任何内存泄漏。

于 2012-04-27T07:33:24.793 回答