繁体   English   中英

这会泄漏内存吗? 我该如何预防?

[英]Does this leak memory? How can I prevent it?

我看到关于如何将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; 
    } 
} 
}

您在哪里看到内存泄漏? 没有动态分配,也没有指针操作。 如果memset coul重写了指向动态分配的内存的指针,但会导致内存泄漏,但是BITMAPINFOHEADER没有指针,只有整数。

memset只是填补了bmih在这种情况下,零对象。 因此,没有内存泄漏。

用指向先前已分配给其他位置的BITMAPINFO对象的指针调用FillBitmapInfo方法。 bmih只是对BITMAPINFO结构的bmiHeader成员的引用。 memset只是为bmih引用的内存区域分配一个值。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM