繁体   English   中英

SDL2内存泄漏C ++

[英]SDL2 Memory Leaks C++

因此,当我运行该应用程序时,总的来说,每件事都运行顺利,但是它运行的越多,速度就越慢。 我查看了它正在使用的内存,当它达到400 mb时,它完全停止了30秒,然后又下降到200。

我对SDL2相当陌生,我认为这是因为我调用的每个帧:

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

例如,我有很多。

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

我不会发布整个代码,因为那是一团糟,但是如果您愿意,可以随时提出。

你知道怎么解决吗?

只是以为我会将我的评论变成答案。

在您的代码中调用

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

每帧,我怀疑如果从那里删除它们,将它们从render循环中初始化出来,然后简单地将它们作为参数传递进去,则应该会丢失内存泄漏:原因是您将只为每个帧创建一个内存中实例然后您可以根据需要重复使用它们。 再次查看时,我怀疑一旦制成optionT可以销毁optionTS ,这样可以节省更多的内存。 (尚未测试,因为我的主机本周末刚刚崩溃,并且我仍在重新安装驱动程序和VS2010)

作为一般规则,请尝试不要在渲染循环中创建/销毁任何对象,否则它们会很快变得大而混乱。

如果可能,请考虑利用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实例超出范围,该表面将被释放。

我敢肯定,可以编写出更好的实现,并根据您的需求进行量身定制,但至少类似的事情可能会阻止您将来的泄漏。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM