我看到这个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;
}
}
}
答案 0 :(得分:4)
你在哪里看到内存泄漏?没有动态分配,也没有
指针操作。如果memset
coul导致内存泄漏
覆盖了动态分配内存的指针,但没有
指针在BITMAPINFOHEADER
中,只是整数。
答案 1 :(得分:2)
在这种情况下,memset
只用零填充bmih
对象。所以没有内存泄漏。
使用指向先前在其他位置分配的FillBitmapInfo
对象的指针调用BITMAPINFO
方法。 bmih
只是对bmiHeader
结构的BITMAPINFO
成员的引用。 memset
只为bmih
引用的内存区域赋值。
答案 2 :(得分:2)
memset()
不会导致内存泄漏。这只是将0x00字节写入bmi
指向的部分内存中。这里没有足够的代码来确定是否有任何内存泄露。