C++ SDL2内存泄漏C++;

C++ SDL2内存泄漏C++;,c++,c,memory-leaks,sdl,sdl-2,C++,C,Memory Leaks,Sdl,Sdl 2,因此,当我运行应用程序时,在开始阶段,每件事情都运行得很顺利,但运行得越多,速度就越慢。我查看了它正在使用的内存,当它达到400MB时,它会完全停止30秒,然后回落到200MB 我对SDL2非常陌生,我认为这是因为我调用的每一帧: optionsTS = TTF_RenderText_Blended(font, "Options.", blanc); optionsT = SDL_CreateTextureFromSurface(renderer, optionsTS); 例如,我有很多 问题

因此,当我运行应用程序时,在开始阶段,每件事情都运行得很顺利,但运行得越多,速度就越慢。我查看了它正在使用的内存,当它达到400MB时,它会完全停止30秒,然后回落到200MB

我对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);
每一帧,我怀疑如果你从那里移除它们,在渲染循环之外初始化它们,并简单地将它们作为参数传入,你应该会丢失内存泄漏:原因是你将只为每个帧创建一个内存实例,然后你可以根据需要重复使用它们。再看一遍,我怀疑一旦你制作了
optionT
,你就可以销毁
optionTS
,这样你会节省更多的内存。(尚未测试,因为我的主机本周末刚刚崩溃,我仍在重新安装驱动程序和VS2010)


作为一般规则,尝试不创建/销毁渲染循环中的任何对象,往往会变得大而凌乱。

如果可能的话,考虑在C++中利用RAII。 例如,创建一个封装SDL_曲面并在析构函数中调用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;
};
然后,每次从SDLAPI抓取SDL_曲面时,都会创建一个MySurface实例,而不必担心何时或是否释放该曲面。一旦MySurface实例超出范围,就会释放该曲面


我确信可以根据您的需要编写和定制更好的实现,但至少类似的内容可以防止将来出现泄漏。

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