-2

SDL api を使用して単純なスネーク ゲームを作成しましたが、ゲームのどこかでメモリ リークが発生しました。ゲームを実行してから約 10 分後に 50 MB 以上の RAM を使用し、まだ拡張中です。漏れを見つけるために最善を尽くしましたが、それを見つけることができません。Dr Memory を使用してみましたが、生成されるログが完全には理解できません。

問題のログは次のとおりです: https://docs.google.com/file/d/0BwXrdShTcyjENmgyR2lrbTJ1aGc/edit?usp=sharing

4

2 に答える 2

3

Dr. Memory のログを見ると、約 2899 回のエラーが 3 つあることがわかります。エラーは次のとおりです。

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()

于 2013-03-12T18:33:21.350 に答える
0

メモリリークは、誤った動的割り当ての使用(またはポインタの操作)が原因で発生します。小さなヘビのゲームにカスタムの動的割り当てを使用したことがないと思うので、何かを台無しにしたと思いますSDL_Surface *

使用するすべての場所を確認してくださいSDL_Surface *。メインゲームループで新しいサーフェスを作成(割り当て)するコードを使用しますか?

新しいサーフェスを作成(割り当てる)するSDL関数はSDL_LoadBMP()、通常、、です。メインゲームループ内でそれらのいずれかを使用しますか?彼らは一般的にそこにいるべきではありませんSDL_GetRGBSurface()SDL_SetVideoMode()

または、動的割り当てを使用しましたか?すべてのポインタを確認してください!

于 2013-03-12T18:10:09.660 に答える