这是SDL计划:
#includeint main(int argc, char** argv){ SDL_Init(SDL_INIT_VIDEO); SDL_Surface* screen = SDL_SetVideoMode(640, 480, 16, SDL_HWSURFACE); SDL_Quit(); return 0; }
用命令编译:
g++ -o test test.cpp -lSDL
这是valgrind的输出:
christian@christian-laptop:~/cpp/tetris$ valgrind --leak-check=full ./test ==3271== Memcheck, a memory error detector ==3271== Copyright (C) 2002-2009, and GNU GPL'd, by Julian Seward et al. ==3271== Using Valgrind-3.5.0-Debian and LibVEX; rerun with -h for copyright info ==3271== Command: ./test ==3271== ==3271== ==3271== HEAP SUMMARY: ==3271== in use at exit: 91,097 bytes in 1,258 blocks ==3271== total heap usage: 14,250 allocs, 12,992 frees, 2,615,177 bytes allocated ==3271== ==3271== 10 bytes in 2 blocks are definitely lost in loss record 8 of 134 ==3271== at 0x4024C1C: malloc (vg_replace_malloc.c:195) ==3271== by 0x4946F04: ??? (in /usr/lib/libX11.so.6.2.0) ==3271== by 0x4945DA1: _XimEncodeLocalICAttr (in /usr/lib/libX11.so.6.2.0) ==3271== by 0x4947195: _XimSetICValueData (in /usr/lib/libX11.so.6.2.0) ==3271== by 0x493FDF1: _XimLocalCreateIC (in /usr/lib/libX11.so.6.2.0) ==3271== by 0x4922478: XCreateIC (in /usr/lib/libX11.so.6.2.0) ==3271== by 0x407AA64: ??? (in /usr/lib/libSDL-1.2.so.0.11.2) ==3271== by 0x407BCBB: ??? (in /usr/lib/libSDL-1.2.so.0.11.2) ==3271== by 0x4069C2A: SDL_VideoInit (in /usr/lib/libSDL-1.2.so.0.11.2) ==3271== by 0x403F9D3: SDL_InitSubSystem (in /usr/lib/libSDL-1.2.so.0.11.2) ==3271== by 0x403FA36: SDL_Init (in /usr/lib/libSDL-1.2.so.0.11.2) ==3271== by 0x8048658: main (in /home/christian/cpp/tetris/test) ==3271== ==3271== 12 bytes in 1 blocks are definitely lost in loss record 12 of 134 ==3271== at 0x4024C1C: malloc (vg_replace_malloc.c:195) ==3271== by 0x4A3DA8D: ??? ==3271== by 0x4A3D48C: ??? ==3271== by 0x4A3D5A4: ??? ==3271== by 0x4A3DD26: ??? ==3271== by 0x4A38BC5: ??? ==3271== by 0x4A38FCD: ??? ==3271== by 0x40717DD: ??? (in /usr/lib/libSDL-1.2.so.0.11.2) ==3271== by 0x407BDCA: ??? (in /usr/lib/libSDL-1.2.so.0.11.2) ==3271== by 0x4069C2A: SDL_VideoInit (in /usr/lib/libSDL-1.2.so.0.11.2) ==3271== by 0x403F9D3: SDL_InitSubSystem (in /usr/lib/libSDL-1.2.so.0.11.2) ==3271== by 0x403FA36: SDL_Init (in /usr/lib/libSDL-1.2.so.0.11.2) ==3271== ==3271== 112 (8 direct, 104 indirect) bytes in 1 blocks are definitely lost in loss record 102 of 134 ==3271== at 0x4024D12: realloc (vg_replace_malloc.c:476) ==3271== by 0x492847E: ??? (in /usr/lib/libX11.so.6.2.0) ==3271== by 0x492976D: ??? (in /usr/lib/libX11.so.6.2.0) ==3271== by 0x492AA41: ??? (in /usr/lib/libX11.so.6.2.0) ==3271== by 0x492B1A4: _XlcCreateLC (in /usr/lib/libX11.so.6.2.0) ==3271== by 0x494B4FA: _XlcDefaultLoader (in /usr/lib/libX11.so.6.2.0) ==3271== by 0x4933153: _XOpenLC (in /usr/lib/libX11.so.6.2.0) ==3271== by 0x49332C2: _XlcCurrentLC (in /usr/lib/libX11.so.6.2.0) ==3271== by 0x4933761: XSetLocaleModifiers (in /usr/lib/libX11.so.6.2.0) ==3271== by 0x407161D: ??? (in /usr/lib/libSDL-1.2.so.0.11.2) ==3271== by 0x407AD8F: ??? (in /usr/lib/libSDL-1.2.so.0.11.2) ==3271== by 0x407BCBB: ??? (in /usr/lib/libSDL-1.2.so.0.11.2) ==3271== ==3271== 112 (8 direct, 104 indirect) bytes in 1 blocks are definitely lost in loss record 103 of 134 ==3271== at 0x4024D12: realloc (vg_replace_malloc.c:476) ==3271== by 0x492847E: ??? (in /usr/lib/libX11.so.6.2.0) ==3271== by 0x492976D: ??? (in /usr/lib/libX11.so.6.2.0) ==3271== by 0x492AA41: ??? (in /usr/lib/libX11.so.6.2.0) ==3271== by 0x492B1A4: _XlcCreateLC (in /usr/lib/libX11.so.6.2.0) ==3271== by 0x494B4FA: _XlcDefaultLoader (in /usr/lib/libX11.so.6.2.0) ==3271== by 0x4933153: _XOpenLC (in /usr/lib/libX11.so.6.2.0) ==3271== by 0x493327D: _XrmInitParseInfo (in /usr/lib/libX11.so.6.2.0) ==3271== by 0x4918F20: ??? (in /usr/lib/libX11.so.6.2.0) ==3271== by 0x491AF37: XrmGetStringDatabase (in /usr/lib/libX11.so.6.2.0) ==3271== by 0x48F8459: ??? (in /usr/lib/libX11.so.6.2.0) ==3271== by 0x48F864E: XGetDefault (in /usr/lib/libX11.so.6.2.0) ==3271== ==3271== LEAK SUMMARY: ==3271== definitely lost: 38 bytes in 5 blocks ==3271== indirectly lost: 208 bytes in 8 blocks ==3271== possibly lost: 0 bytes in 0 blocks ==3271== still reachable: 90,851 bytes in 1,245 blocks ==3271== suppressed: 0 bytes in 0 blocks ==3271== Reachable blocks (those to which a pointer was found) are not shown. ==3271== To see them, rerun with: --leak-check=full --show-reachable=yes ==3271== ==3271== For counts of detected and suppressed errors, rerun with: -v ==3271== ERROR SUMMARY: 4 errors from 4 contexts (suppressed: 93 from 14)
为什么这个基本的SDL程序会泄漏内存?
即使对于没有完整SDL的基本OpenGL"hello world"程序,Valgrind也在OpenGL库内部给出了类似的警告.它很奇特,但我已经假设了
库实现者知道他们正在做什么(可能预先分配一些他们从不费心去做的小静态缓冲区),
即使他们不这样做,也是一次性泄漏,当程序终止时,操作系统会回收,
并没有失去太多的睡眠.