【问题标题】:Has SDL2 a memory leak?SDL2 有内存泄漏吗?
【发布时间】:2019-12-21 00:00:34
【问题描述】:

我注意到我所有使用 SDL2 的项目都有内存泄漏,所以我编写了一个小测试程序,如下所示:

SDL_Init(SDL_INIT_VIDEO);
SDL_Window *win = SDL_CreateWindow("", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 100, 100, SDL_WINDOW_RESIZABLE);
SDL_Renderer *ren = SDL_CreateRenderer(win, 0, 0);

bool running = true;
SDL_Event event;
while (running) {
    while(SDL_PollEvent(&event) != 0) {
        if(event.type == SDL_QUIT) {
            running = false;
        }
    }

    SDL_RenderClear(ren);
    SDL_RenderPresent(ren); //Thanks to keltar 
}
SDL_DestroyRenderer(ren);
SDL_DestroyWindow(win);
SDL_Quit();

我没有注意到任何可能在这里产生泄漏的东西。

我正在使用来自 Xcode 的 Instruments 来检测泄漏。前十秒没有泄漏。在接下来的 10 秒内,大约会产生 15 个泄漏。在程序开始后 40 秒内,这种情况会持续减弱。从 40 秒开始,没有创建新的泄漏,但分配的内存仍在不断增长。编辑:当我使用 SDL_RenderPresent 时,内存不再增长。

那么 SDL2 是否存在内存泄漏,是我在代码中犯了错误还是 Instruments 造成了一些误报?

【问题讨论】:

  • I'm using...Xcode 好吧,这就是你的问题。 :P
  • 你没有用SDL_RenderPresent刷新你的渲染器。底层渲染器实现(例如 opengl)可能会将每个 RenderClear 记录到命令缓冲区中,但刷新永远不会发生并且缓冲区会增长。至于泄漏,您的仪器能否提供分配位置或堆栈跟踪的信息?
  • @keltar 谢谢你的把戏,现在内存不再增长了。我真的不知道这个内存是什么意思,你有 Xcode 吗?因为如果你有,我可以从 Instruments 向你发送一份存档。

标签: c++ xcode memory-leaks sdl instruments


【解决方案1】:

您没有删除某个对象,或者您正在循环中重新创建它,这可能是一些错误。 SDL2 本身不应该有任何内存泄漏。不过,我强烈建议您使用最新版本(此时此刻是 2.0.10)。请尝试在您的演示程序中绘制一些东西来验证这里没有任何内存泄漏。尝试重复项目代码的一小部分以呈现类似的效果。此代码没有任何作用,也无法重现您的问题。但是,如果您发现这里是 SDL2 端的真正内存泄漏,请在此处提交报告https://bugzilla.libsdl.org/。在此之前,请从 Mercurial 官方存储库https://hg.libsdl.org/SDL/ 中提取最新的资源并重试您的测试,以确认该错误仍然存​​在于主流中。

【讨论】:

  • 我使用的是 SDL 2.0.10,我在两天前下载了那个版本。我不知道你第一句话是什么意思。我展示了整个源代码。我也不知道为什么你不能重现泄漏,我可以。奇怪的是,如果我渲染一些东西,所有的泄漏都会消失。你知道为什么吗。当使用 OpenGL 时,我无法使用 SDL 函数渲染某些东西。你知道在那里做什么吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多