我在Windows上使用带有Code :: blocks的SDL2。
我写这个小程序。但它会导致内存泄漏! 代码很简单。它只会清除并更新屏幕。
#include <SDL.h>
const int SCREEN_WIDTH = 640;
const int SCREEN_HEIGHT = 480;
SDL_Window* window = NULL;
SDL_Renderer* renderer = NULL;
SDL_Event event;
bool quit = false;
void loadSDL();
void closeSDL();
int main( int argc, char* args[] )
{
loadSDL();
while(!quit)
{
while(SDL_PollEvent(&event) != 0)
{
if(event.type == SDL_QUIT)
{
quit = true;
}
}
SDL_RenderClear( renderer );
SDL_RenderPresent( renderer );
}
closeSDL();
return 0;
}
void loadSDL()
{
SDL_Init( SDL_INIT_VIDEO );
window = SDL_CreateWindow( "Test1", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, SCREEN_WIDTH, SCREEN_HEIGHT, SDL_WINDOW_SHOWN );
renderer = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);
SDL_SetRenderDrawColor(renderer, 0x0, 0x0, 0x0, 0xFF);
}
void closeSDL()
{
SDL_DestroyRenderer( renderer );
SDL_DestroyWindow( window );
window = NULL;
renderer = NULL;
SDL_Quit();
}
我不知道出了什么问题......
如果我评论此行
SDL_RenderClear( renderer );
没有内存泄漏!
答案 0 :(得分:1)
内存泄漏并不是最明显的追踪事项。要正确识别泄漏,您需要使用评论中提到的分析工具。
您所看到的最常见的原因是操作系统可以在请求进程之前为进程分配内存并延迟释放未使用的内存。有时,当您的进程的RAM使用量在任务管理器中增长时,这看起来像是泄漏。如果你等一会儿,它可能会稳定下来。
至于SDL_RenderClear()中的泄漏,有助于了解您正在使用哪个渲染器。他们有不同的代码路径。但是,在这种情况下,它们非常相似。这是来自SDL_render_gl.c的GL版本:
static int
GL_RenderClear(SDL_Renderer * renderer)
{
GL_RenderData *data = (GL_RenderData *) renderer->driverdata;
GL_ActivateRenderer(renderer);
data->glClearColor((GLfloat) renderer->r * inv255f,
(GLfloat) renderer->g * inv255f,
(GLfloat) renderer->b * inv255f,
(GLfloat) renderer->a * inv255f);
data->glClear(GL_COLOR_BUFFER_BIT);
return 0;
}
此处唯一的间接调用是GL_ActivateRenderer(),它进行简单的比较和设置。 Direct3D RenderClear()稍微复杂一点,但基本上是一样的。你的问题不太可能在这里。