浏览代码

Merge pull request #19181 from guilhermefelipecgs/fix_memory_leak

Fix memory leak in set_custom_mouse_cursor
Max Hilbrunner 7 年之前
父节点
当前提交
daa136784d
共有 3 个文件被更改,包括 17 次插入5 次删除
  1. 7 3
      platform/osx/os_osx.mm
  2. 6 1
      platform/windows/os_windows.cpp
  3. 4 1
      platform/x11/os_x11.cpp

+ 7 - 3
platform/osx/os_osx.mm

@@ -1546,7 +1546,7 @@ void OS_OSX::set_custom_mouse_cursor(const RES &p_cursor, CursorShape p_shape, c
 
 		image = texture->get_data();
 
-		NSBitmapImageRep *imgrep = [[[NSBitmapImageRep alloc]
+		NSBitmapImageRep *imgrep = [[NSBitmapImageRep alloc]
 				initWithBitmapDataPlanes:NULL
 							  pixelsWide:int(texture_size.width)
 							  pixelsHigh:int(texture_size.height)
@@ -1556,7 +1556,7 @@ void OS_OSX::set_custom_mouse_cursor(const RES &p_cursor, CursorShape p_shape, c
 								isPlanar:NO
 						  colorSpaceName:NSDeviceRGBColorSpace
 							 bytesPerRow:int(texture_size.width) * 4
-							bitsPerPixel:32] autorelease];
+							bitsPerPixel:32];
 
 		ERR_FAIL_COND(imgrep == nil);
 		uint8_t *pixels = [imgrep bitmapData];
@@ -1588,16 +1588,20 @@ void OS_OSX::set_custom_mouse_cursor(const RES &p_cursor, CursorShape p_shape, c
 
 		image->unlock();
 
-		NSImage *nsimage = [[[NSImage alloc] initWithSize:NSMakeSize(texture_size.width, texture_size.height)] autorelease];
+		NSImage *nsimage = [[NSImage alloc] initWithSize:NSMakeSize(texture_size.width, texture_size.height)];
 		[nsimage addRepresentation:imgrep];
 
 		NSCursor *cursor = [[NSCursor alloc] initWithImage:nsimage hotSpot:NSMakePoint(p_hotspot.x, p_hotspot.y)];
 
+		[cursors[p_shape] release];
 		cursors[p_shape] = cursor;
 
 		if (p_shape == CURSOR_ARROW) {
 			[cursor set];
 		}
+
+		[imgrep release];
+		[nsimage release];
 	} else {
 		// Reset to default system cursor
 		cursors[p_shape] = NULL;

+ 6 - 1
platform/windows/os_windows.cpp

@@ -2081,7 +2081,7 @@ void OS_Windows::set_custom_mouse_cursor(const RES &p_cursor, CursorShape p_shap
 		UINT size = sizeof(UINT) * image_size;
 
 		// Create the BITMAP with alpha channel
-		COLORREF *buffer = (COLORREF *)malloc(sizeof(COLORREF) * image_size);
+		COLORREF *buffer = (COLORREF *)memalloc(sizeof(COLORREF) * image_size);
 
 		image->lock();
 		for (UINT index = 0; index < image_size; index++) {
@@ -2108,6 +2108,8 @@ void OS_Windows::set_custom_mouse_cursor(const RES &p_cursor, CursorShape p_shap
 		GetMaskBitmaps(bitmap, clrTransparent, hAndMask, hXorMask);
 
 		if (NULL == hAndMask || NULL == hXorMask) {
+			memfree(buffer);
+			DeleteObject(bitmap);
 			return;
 		}
 
@@ -2132,6 +2134,9 @@ void OS_Windows::set_custom_mouse_cursor(const RES &p_cursor, CursorShape p_shap
 		if (hXorMask != NULL) {
 			DeleteObject(hXorMask);
 		}
+
+		memfree(buffer);
+		DeleteObject(bitmap);
 	} else {
 		// Reset to default system cursor
 		cursors[p_shape] = NULL;

+ 4 - 1
platform/x11/os_x11.cpp

@@ -2463,7 +2463,7 @@ void OS_X11::set_custom_mouse_cursor(const RES &p_cursor, CursorShape p_shape, c
 		cursor_image->yhot = p_hotspot.y;
 
 		// allocate memory to contain the whole file
-		cursor_image->pixels = (XcursorPixel *)malloc(size);
+		cursor_image->pixels = (XcursorPixel *)memalloc(size);
 
 		image->lock();
 
@@ -2489,6 +2489,9 @@ void OS_X11::set_custom_mouse_cursor(const RES &p_cursor, CursorShape p_shape, c
 		if (p_shape == CURSOR_ARROW) {
 			XDefineCursor(x11_display, x11_window, cursors[p_shape]);
 		}
+
+		memfree(cursor_image->pixels);
+		XcursorImageDestroy(cursor_image);
 	} else {
 		// Reset to default system cursor
 		if (img[p_shape]) {