【问题标题】:Big memory leak in SDL_InitSDL_Init 中的大内存泄漏
【发布时间】:2014-06-14 12:23:39
【问题描述】:

编辑:更新了一些新信息(粗体)。此外,更新了代码和 Valgrinds 输出。

我最近开始使用 SDL2 作为我的图形库。 在开发了一些东西之后,我决定运行 Valgrind,发现我正在泄漏内存......很多内存。

缩小范围后,我编译了这段代码(C语言):

#include <SDL2/SDL.h>

int main(int argc, char** argv)
{
    SDL_Init(SDL_INIT_EVERYTHING);
    SDL_QuitSubSystem(SDL_INIT_EVERYTHING);
    SDL_Quit();

    return 0;
}

这是制作文件:

CC = gcc
CCFLAGS = -Wall -o0
LDFLAGS = -lSDL2
SOURCES= main.c
OBJECTS=$(SOURCES:.c=.o)
EXE = Test

.PHONY:
all: $(OBJECTS)
    $(CC) $(OBJECTS) $(CCFLAGS) $(LDFLAGS) -o $(EXE)

clean:
    rm $(OBJECTS) $(EXE)

得到了这个 Valgrind 错误:

==30933== Memcheck, a memory error detector
==30933== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al.
==30933== Using Valgrind-3.10.0.SVN and LibVEX; rerun with -h for copyright info
==30933== Command: ./Test
==30933== 
==30933== 
==30933== HEAP SUMMARY:
==30933==     in use at exit: 308,407 bytes in 559 blocks
==30933==   total heap usage: 9,346 allocs, 8,787 frees, 2,502,489 bytes allocated
==30933== 
==30933== LEAK SUMMARY:
==30933==    definitely lost: 197,226 bytes in 6 blocks
==30933==    indirectly lost: 6,272 bytes in 8 blocks
==30933==      possibly lost: 0 bytes in 0 blocks
==30933==    still reachable: 104,909 bytes in 545 blocks
==30933==         suppressed: 0 bytes in 0 blocks
==30933== Rerun with --leak-check=full to see details of leaked memory
==30933== 
==30933== For counts of detected and suppressed errors, rerun with: -v
==30933== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 4 from 1)

我环顾四周,看到很多人抱怨 SDL 中的内存泄漏,但他们都非常小(大约 16 字节,而不是 200,000!)。 另外,我检查了互联网上的其他示例,尝试在我的计算机上运行它们,它们都有相同的泄漏(我假设是 SDL_Init)。

我在 Ubuntu13-64Bit 上运行。

【问题讨论】:

  • 不是 SDL 专家,我只能建议您在调用 SDL_Quit() 之前关闭所有子系统。 IE。 SDL_QuitSubSystem(SDL_INIT_EVERYTHING);
  • @WhozCraig 没用:
  • 呃,我想试试看。
  • 你为什么在乎? Linux 最终将释放所有未被任何进程使用的块。我错过了什么吗?
  • @LeventeKurusa 虽然您对只是这不是什么大问题是对的,但 sdl 分配那么多数据而不释放它会使以后检查内存泄漏变得更加困难并且,我真的很想解决这个问题,以避免在程序运行时出现更多的内存泄漏。

标签: c++ memory-leaks sdl-2


【解决方案1】:

是的,SDL 中存在一些漏洞,但它可能来自不同的地方,其中一些并不是 SDL 的错。

例如,我的显卡驱动程序 (nvidia) 泄漏了 10Mb 的内存。 X11 也以一些大泄漏而闻名。我不会那么担心,有些事情是你无法控制的。

在您的具体情况下,我将使用标志 --leak-check=full --track-origins=yes --show-reachable=yes 运行 valgrind,查看泄漏是否真的来自 SDL,如果尚未报告,则在 http://bugzilla.libsdl.org 中发布有关它的错误。

【讨论】:

  • 谢谢。你为我节省了很多时间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-02
  • 2015-03-07
  • 2013-03-11
相关资源
最近更新 更多