2010-01-04 79 views
18

这里是SDL程序:valgrind为什么说基本的SDL程序正在泄漏内存?

#include <SDL/SDL.h> 

int 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的输出:

[email protected]:~/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程序泄漏内存?

+1

它很可能是内存泄漏在SDL库中。但我不确定。 – rogeriopvl 2010-01-04 02:13:27

+0

做了一些研究,发现SDL_SetVideoMode返回的曲面不能从调用者中解放出来。我删除了这一行,但我仍然从Valgrind获得相同的结果。确实是 – Christian 2010-01-04 02:21:46

回答

20

即使对于没有完整SDL的基本OpenGL“hello world”程序,Valgrind也会在OpenGL库内部提供类似的警告。这是奇特的,但我认为

  • 库实现者知道他们在做什么(可能是预先分配一些小静态缓冲他们从来没有刻意去免费),
  • 即使他们不这样做,这是一个当程序终止时,操作系统会收回这个时间泄漏,

并没有失去太多的睡眠。

+1

。而且这不仅仅是使用OpenGL,Valgrind一直向我展示我无法验证的泄漏(例如,在pthreads库中)。你可以通过设置抑制漏洞来解决这个问题,这些漏洞与你的程序没有任何关系。 – stijn 2010-01-04 09:16:49

+0

当你卸载这个库而没有真正终止这个进程然后重新加载时会发生什么:你实际上是否有内存泄漏,或者是在卸载时释放内存? – 2010-01-04 19:20:04

+1

不知道你是什么意思,Matthieu。我试过使用dl库动态加载SDL。我加载库,调用相同的基本函数,然后卸载库。这导致了21倍的内存泄漏! – Christian 2010-01-06 02:01:50

-6

对于标准实现,单身人士几乎总是一个'泄漏'。不过,这通常是可以的,因为通常情况下,它不像你想卸载你的打印到控制台的能力。

0

SDL肯定有内存泄漏问题SDL_TLSCleanupSDL_TLSData

实际上,SDL_TLSCleanup永远不会要求线程。

0

在调用SDL_Quit()之前,应该释放您加载的每个SDL_Surface。

要做到这一点,只需使用SDL_FreeSurface(surfaceName)释放内存中分配的曲面。