我试图修复C++中的内存泄漏,我对C++比较陌生,所以也许是一个愚蠢的事情.我有一些代码需要一个屏幕捕获,我正在为Image我分配一些内存然后操作.这是一些相关的代码:
RGBTRIPLE* ScreenShot(char *BmpName, DWORD &height, DWORD &width, char* bmpToFree){ DWORD FileSize = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+(sizeof(RGBTRIPLE)+1 * (Width*Height * 4)); char *BmpFileData = (char*)GlobalAlloc(0x0040, FileSize); // Some code BitBlt(CaptureDC, 0, 0, Width, Height, DevC, 0, 0, SRCCOPY | CAPTUREBLT); GetDIBits(CaptureDC, CaptureBitmap, 0, Height, Image, (LPBITMAPINFO)BInfoHeader, DIB_RGB_COLORS); height = Height; width = Width; bmpToFree = BmpFileData; DeleteObject(CaptureBitmap); DeleteObject(CaptureDC); }
正如你所看到的,我没有释放BmpFileData GlobalFree(BmpFileData)
因为我仍然需要在另一个方法中使用这个数据所以我保持一个引用将指针传递给这一行中的另一个指针bmpToFree = BmpFileData;
所以现在我对这些数据做了一些工作,然后我用GlobalFree()
这种方式:
char* bmpToFree = NULL; RGBTRIPLE *image = ScreenShot("Prueba.bmp", h, w, bmpToFree); // Do some work GlobalFree(bmpToFree);
但就这样我有内存泄漏.如果我改为放入GlobalFree(BmpFileData)
内部Screenshot()
方法,我的泄漏消失了,但我没有数据可以处理.
我究竟做错了什么?
问题是bmpToFree
应该是对指针的引用.
RGBTRIPLE* ScreenShot(.., char* bmpToFree)
应该
RGBTRIPLE* ScreenShot(.., char* &bmpToFree)
或者你可以用另一种方式解决问题.
RGBTRIPLE* ScreenShot(.., char** bmpToFree) { ... *bmpToFree = BmpFileData; }
它们基本相同,可以&
是变量(char *
)的reference(),也可以是变量()的指针*
(char *
).当您需要更改传入的原始变量而不是副本时,可以使用它们.