首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SDL2内存泄漏C++

SDL2内存泄漏C++
EN

Stack Overflow用户
提问于 2013-11-22 20:49:23
回答 2查看 1.3K关注 0票数 2

所以当我运行这个应用程序时,在最开始的时候,所有的东西都运行得很顺利,但是运行得越多,它就越慢。我看了看它正在使用的内存,当它达到400MB时,它完全停止了30秒,然后又下降到200。

我对SDL2非常陌生,我想这是因为我调用的每一帧:

代码语言:javascript
复制
optionsTS = TTF_RenderText_Blended(font, "Options.", blanc);
optionsT = SDL_CreateTextureFromSurface(renderer, optionsTS);

例如,我有很多这样的东西。

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

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

你知道怎么解决吗?

EN

回答 2

Stack Overflow用户

发布于 2013-11-25 00:13:57

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

在您的代码中调用

代码语言:javascript
复制
optionsTS = TTF_RenderText_Blended(font, "Options.", blanc);
optionsT = SDL_CreateTextureFromSurface(renderer, optionsTS);

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

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

票数 3
EN

Stack Overflow用户

发布于 2013-12-12 07:02:30

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

代码语言:javascript
复制
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实例超出作用域,这个表面就会被释放。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20145347

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档