tags:

views:

452

answers:

2

Here is the SDL program:

#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;

}

Compiled with the command:

g++ -o test test.cpp -lSDL

And here is the output of 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)

Why is this basic SDL program leaking memory?

+2  A: 

Even for basic OpenGL "hello world" program without the full SDL, Valgrind gives me similar warnings deep inside the OpenGL libraries. It's peculiar, but I've assumed

  • The library implementors know what they're doing (probably preallocating some small static buffers they never bother to free),
  • Even if they don't, it's a one-time leak that'll be reclaimed by the OS when the program terminates,

and haven't lost much sleep over it.

indeed. And it's not just with OpenGL, Valgrind has been always been showing me leaks I could not verify (eg in pthreads lib). You can get around this by setting up suppressions for leaks that do not have anything to do with your program.
stijn
What happens when you unload the library without actually terminating the process and then reload it: do you actually have a memory leak then or was the memory deallocated at the unload ?
Matthieu M.
Not sure what you mean by this, Matthieu. I've tried dynamically loading SDL using the dl library. I load the library, call the same basic functions, and then unload the library. This results in a memory leak 21 times as large!
Christian
A: 

Singletons are pretty much always a 'leak' with standard implementations. That is usually ok, though, since normally it's not like you want to unload your ability to do things like print to the console.

Charles Eli Cheese