【发布时间】:2019-12-21 00:00:34
【问题描述】:
我注意到我所有使用 SDL2 的项目都有内存泄漏,所以我编写了一个小测试程序,如下所示:
SDL_Init(SDL_INIT_VIDEO);
SDL_Window *win = SDL_CreateWindow("", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 100, 100, SDL_WINDOW_RESIZABLE);
SDL_Renderer *ren = SDL_CreateRenderer(win, 0, 0);
bool running = true;
SDL_Event event;
while (running) {
while(SDL_PollEvent(&event) != 0) {
if(event.type == SDL_QUIT) {
running = false;
}
}
SDL_RenderClear(ren);
SDL_RenderPresent(ren); //Thanks to keltar
}
SDL_DestroyRenderer(ren);
SDL_DestroyWindow(win);
SDL_Quit();
我没有注意到任何可能在这里产生泄漏的东西。
我正在使用来自 Xcode 的 Instruments 来检测泄漏。前十秒没有泄漏。在接下来的 10 秒内,大约会产生 15 个泄漏。在程序开始后 40 秒内,这种情况会持续减弱。从 40 秒开始,没有创建新的泄漏,但分配的内存仍在不断增长。编辑:当我使用 SDL_RenderPresent 时,内存不再增长。
那么 SDL2 是否存在内存泄漏,是我在代码中犯了错误还是 Instruments 造成了一些误报?
【问题讨论】:
-
I'm using...Xcode好吧,这就是你的问题。 :P -
你没有用
SDL_RenderPresent刷新你的渲染器。底层渲染器实现(例如 opengl)可能会将每个RenderClear记录到命令缓冲区中,但刷新永远不会发生并且缓冲区会增长。至于泄漏,您的仪器能否提供分配位置或堆栈跟踪的信息? -
@keltar 谢谢你的把戏,现在内存不再增长了。我真的不知道这个内存是什么意思,你有 Xcode 吗?因为如果你有,我可以从 Instruments 向你发送一份存档。
标签: c++ xcode memory-leaks sdl instruments