我使用 SDL api 编写了一个简单的蛇游戏,游戏中某处存在内存泄漏,因为在运行游戏大约 10 分钟后,它占用了超过 50mb 的内存并且它仍在扩展。我尽我所能找到泄漏,但我找不到它。我尝试使用 Dr Memory,但我无法完全理解它产生的日志。
这是有问题的日志: https ://docs.google.com/file/d/0BwXrdShTcyjENmgyR2lrbTJ1aGc/edit?usp=sharing
我使用 SDL api 编写了一个简单的蛇游戏,游戏中某处存在内存泄漏,因为在运行游戏大约 10 分钟后,它占用了超过 50mb 的内存并且它仍在扩展。我尽我所能找到泄漏,但我找不到它。我尝试使用 Dr Memory,但我无法完全理解它产生的日志。
这是有问题的日志: https ://docs.google.com/file/d/0BwXrdShTcyjENmgyR2lrbTJ1aGc/edit?usp=sharing
在您的 Dr. Memory 日志中,您可以看到您有 3 个错误,计数约为 2899 次。错误是:
Error # 154: 2899
Error # 155: 2899
Error # 369: 2898
因此,如果您查看错误:
Error #154: GDI USAGE ERROR: same bitmap 0x46052c24 selected into two different DC's 0x08012c43 and 0xbe012c3e
# 0 SDL.dll!SDL_UnregisterApp +0x3063 (0x681304c3 <SDL.dll+0x304c3>)
# 1 SDL.dll!SDL_UpdateRect +0x69 (0x68125d7a <SDL.dll+0x25d7a>)
# 2 SDL.dll!SDL_Flip +0x52 (0x68125ff3 <SDL.dll+0x25ff3>)
# 3 draw() [L:/git/snake/src/main.cpp:133]
# 4 SDL_main [L:/git/snake/src/main.cpp:92]
# 5 console_main [./src/main/win32/SDL_win32_main.c:315]
# 6 WinMain@16 [./src/main/win32/SDL_win32_main.c:398]
# 7 main [L:/git/snake/src/main.cpp:211]
Note: @0:00:04.148 in thread 3940
Error #155: GDI USAGE ERROR: DC 0x08012c43 that contains selected object being deleted
# 0 system call NtGdiDeleteObjectApp
# 1 GDI32.dll!DeleteDC +0xb6 (0x75b1596a <GDI32.dll+0x1596a>)
# 2 GDI32.dll!DeleteDC +0x11 (0x75b158c5 <GDI32.dll+0x158c5>)
# 3 SDL.dll!SDL_UnregisterApp +0x30c9 (0x6813052a <SDL.dll+0x3052a>)
# 4 SDL.dll!SDL_UpdateRect +0x69 (0x68125d7a <SDL.dll+0x25d7a>)
# 5 SDL.dll!SDL_Flip +0x52 (0x68125ff3 <SDL.dll+0x25ff3>)
# 6 draw() [L:/git/snake/src/main.cpp:133]
# 7 SDL_main [L:/git/snake/src/main.cpp:92]
# 8 console_main [./src/main/win32/SDL_win32_main.c:315]
# 9 WinMain@16 [./src/main/win32/SDL_win32_main.c:398]
#10 main [L:/git/snake/src/main.cpp:211]
Note: @0:00:04.149 in thread 3940
Error #369: LEAK 60 direct bytes 0x04c09070-0x04c090ac + 0 indirect bytes
# 0 SDL.dll!SDL_CreateRGBSurface +0x8a (0x681250cb <SDL.dll+0x250cb>)
# 1 SDL_ttf.dll!TTF_RenderUNICODE_Solid +0xa6 (0x6f4c2e87 <SDL_ttf.dll+0x2e87>)
# 2 SDL_ttf.dll!TTF_RenderText_Solid +0x62 (0x6f4c3253 <SDL_ttf.dll+0x3253>)
# 3 draw() [L:/git/snake/src/main.cpp:130]
# 4 SDL_main [L:/git/snake/src/main.cpp:92]
# 5 console_main [./src/main/win32/SDL_win32_main.c:315]
# 6 WinMain@16 [./src/main/win32/SDL_win32_main.c:398]
# 7 main [L:/git/snake/src/main.cpp:211]
您似乎在某个循环中分配了新内存,但忘记了释放。
对于标记为 LEAK 的错误 #369:调用后TTF_RenderText_Solid()
,您需要调用SDL_FreeSurface()
。
内存泄漏是由错误的动态分配使用(或弄乱指针)引起的。我猜您还没有为小型蛇游戏使用任何自定义动态分配,所以我猜您弄乱了SDL_Surface *
.
检查您使用的每个地方SDL_Surface *
。是否使用任何涉及在主游戏循环中创建(分配)新表面的代码?
创建(分配)新表面的 SDL 函数通常SDL_LoadBMP()
是SDL_GetRGBSurface()
和SDL_SetVideoMode()
。你在主游戏循环中使用它们中的任何一个吗?他们通常不应该在那里。
或者,也许您使用了任何动态分配?检查你所有的指针!