当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《为什么valgrind说基本的SDL程序正在泄漏内存?》经验,为你挑选了1个好方法。

这是SDL计划:

#include 

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

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程序会泄漏内存?



1> user168715..:

即使对于没有完整SDL的基本OpenGL"hello world"程序,Valgrind也在OpenGL库内部给出了类似的警告.它很奇特,但我已经假设了

库实现者知道他们正在做什么(可能预先分配一些他们从不费心去做的小静态缓冲区),

即使他们不这样做,也是一次性泄漏,当程序终止时,操作系统会回收,

并没有失去太多的睡眠.

推荐阅读
郑谊099_448
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有