【问题标题】:SDL2 Memory Leaks C++SDL2 内存泄漏 C++
【发布时间】:2013-11-22 12:49:22
【问题描述】:

因此,当我运行应用程序时,在 biginning 中,一切都运行得很顺利,但运行得越多,运行速度就越慢。我查看了它正在使用的内存,当它达到 400 mb 时,它会完全停止 30 秒,然后回落到 200。

我对 SDL2 很陌生,我认为这是因为我调用的每一帧:

optionsTS = TTF_RenderText_Blended(font, "Options.", blanc);
optionsT = SDL_CreateTextureFromSurface(renderer, optionsTS);

例如,我有很多。

问题是我不知道如何正确删除每一帧的对象,因为如果我执行 SDL_FreeSurface 会出错。

我不会发布我的整个代码,因为它是一团糟,但如果你想要它,请随时询问。

你知道如何解决这个问题吗?

【问题讨论】:

  • 嗨,我会从每个帧中删除 optionsTS 和 optionsT 并将其作为变量传递,这样它只会创建一次,而不是每个帧。然后,您可以在需要它的每个帧中将其作为参数传递。一般来说,尽量不要在渲染循环中创建任何对象,这样会很快变得又大又乱。
  • 好的,谢谢,我看看有没有帮助
  • 谢谢!!!成功了!!!
  • 嗨:)我已将评论变成答案,这样它就可以被接受;)

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


【解决方案1】:

只是想我会把我的评论变成答案。

在您调用的代码中

optionsTS = TTF_RenderText_Blended(font, "Options.", blanc);
optionsT = SDL_CreateTextureFromSurface(renderer, optionsTS);

每一帧,我怀疑如果你从那里删除它们,在渲染循环之外初始化它们并简单地将它们作为参数传递,你应该不会丢失内存泄漏:原因是你只会在内存中创建一个每个实例,然后您可以根据需要重复使用它们。再看一遍,我怀疑你可以在创建optionT 后销毁optionTS,这样你会节省更多的内存。 (还没测试,因为我的主机这个周末刚死机,我还在重新安装驱动和VS2010)

作为一般规则,尽量不要在渲染循环中创建/销毁任何对象,否则会很快变得又大又乱。

【讨论】:

    【解决方案2】:

    如果可能,请考虑在 C++ 中利用 RAII。 例如,创建一个包装 SDL_Surface 并在析构函数中调用 SDL_FreeSurface 的类。

    class MySurface
    {
    public:
        MySurface(SDL_Surface & surface) : m_surface(surface) {}
        ~MySurface() {SDL_FreeSurface(m_surface);}
    
        SDL_Surface & GetSDLSurface() {return m_surface;}
    
    private:
        SDL_Surface & m_surface;
    };
    

    然后,您将在每次从 SDL API 获取 SDL_Surface 时创建一个 MySurface 实例,而您不必担心何时或是否释放该表面。只要您的 MySurface 实例超出范围,就会释放表面。

    我确信可以根据您的需要编写和定制更好的实现,但至少与此类似的内容可能会防止您在未来发生泄漏。

    【讨论】:

      猜你喜欢
      • 2019-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-27
      • 2010-11-11
      • 2017-02-18
      • 1970-01-01
      • 2015-11-19
      相关资源
      最近更新 更多