【问题标题】:SDL memory usageSDL 内存使用情况
【发布时间】:2011-04-09 19:58:11
【问题描述】:

我正在编写一个非常基本的 SDL 应用程序,但是当我通过 valgrind 运行它时,它报告了几个显然与 SDL 库相关的丢失块(在你问它之前,我确实调用了 SDL_Quit,或者更准确地说,我调用了 @987654321 @)。这是一个例子:

==2525== 192 (16 direct, 176 indirect) bytes in 1 blocks are definitely lost in loss record 107 of 131
==2525==    at 0x4C25502: realloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==2525==    by 0x644244A: ??? (in /usr/lib/libX11.so.6.3.0)
==2525==    by 0x6442989: ??? (in /usr/lib/libX11.so.6.3.0)
==2525==    by 0x64440A2: ??? (in /usr/lib/libX11.so.6.3.0)
==2525==    by 0x6444915: _XlcCreateLC (in /usr/lib/libX11.so.6.3.0)
==2525==    by 0x6462B5F: _XlcDefaultLoader (in /usr/lib/libX11.so.6.3.0)
==2525==    by 0x644C325: _XOpenLC (in /usr/lib/libX11.so.6.3.0)
==2525==    by 0x644C467: _XlcCurrentLC (in /usr/lib/libX11.so.6.3.0)
==2525==    by 0x644C4BD: XSetLocaleModifiers (in /usr/lib/libX11.so.6.3.0)
==2525==    by 0x4E69EED: ??? (in /usr/lib/libSDL-1.2.so.0.11.3)
==2525==    by 0x4E6A57F: ??? (in /usr/lib/libSDL-1.2.so.0.11.3)
==2525==    by 0x4E59E00: SDL_VideoInit (in /usr/lib/libSDL-1.2.so.0.11.3)

我在 StackOverflow 上搜索了这里,发现了一个类似的问题。答案显然是,在库中分配了一些小缓冲区,作者从不关心释放这些缓冲区。我的问题是,这种方法的动机是什么?为什么分配一些东西然后故意不free()呢?

【问题讨论】:

  • 可能是库中的错误?并不是所有的代码都写得很完美。他们很可能不小心忘记释放其中的一些内存,因为它是一个非常大的库。
  • 我没有重复评论的意思,但我忘了补充:如果确实是内存泄漏,您可能需要向 SDL 的开发人员报告。然而,Eelke 确实提出了一个有效的观点,即他们可能只是等到最后才真正释放它。

标签: c memory-leaks sdl valgrind


【解决方案1】:

如果在程序结束之前需要缓冲区,则无需释放它们。当一个程序退出它正在使用的所有内存时,操作系统无论如何都会释放它。如果程序在退出之前费心释放块,它只会减慢程序的退出速度。

【讨论】:

  • 这可能是原因,但我认为这是一个糟糕的原因,尤其是对于图书馆而言,我不鼓励任何人关注它。首先,这很糟糕,因为操作系统不能保证释放内存。通常较旧的或没有内存管理器的不会。其次,正是因为这个问题,这很糟糕:Valgrind 之类的工具会适得其反,使得调试自己的代码变得非常困难。第三,这对图书馆不利,因为关闭图书馆不一定是该过程的结束。如果客户要求你的图书馆关闭,释放所有内存是礼貌的。
  • 我同意这不是一个好的做法,尤其是对于图书馆来说,我只是说这不一定是值得担心的事情。许多应用程序不会清理那里的单例,因为担心何时释放它们是不值得的。
猜你喜欢
  • 1970-01-01
  • 2023-04-09
  • 2015-02-03
  • 2012-05-30
  • 2021-02-26
  • 2010-10-24
  • 2015-06-14
  • 2015-01-06
  • 1970-01-01
相关资源
最近更新 更多