C++ 在SDL中,SDL_Quit()是否释放每个曲面?
基本上,在程序终止之前即将存在的曲面上,我需要为每个曲面运行C++ 在SDL中,SDL_Quit()是否释放每个曲面?,c++,c,sdl,surface,C++,C,Sdl,Surface,基本上,在程序终止之前即将存在的曲面上,我需要为每个曲面运行SDL\u FreeSurface(),还是SDL\u Quit()为我处理所有这些问题 我这样做主要是因为指向我的许多曲面的指针都是类成员,因此如果我想在它们各自的曲面上运行SDL\u FreeSurface(),我需要跟踪每个类实例(在全局数组或其他东西中)。如果SDL_Quit()能为我一蹴而就,我更愿意这么做:我已经有一段时间没有使用SDL了,但我非常确定SDL_Quit只是清理屏幕表面(您在开始时设置的主屏幕缓冲区)。必须释放
SDL\u FreeSurface()
,还是SDL\u Quit()
为我处理所有这些问题
我这样做主要是因为指向我的许多曲面的指针都是类成员,因此如果我想在它们各自的曲面上运行
SDL\u FreeSurface()
,我需要跟踪每个类实例(在全局数组或其他东西中)。如果SDL_Quit()能为我一蹴而就,我更愿意这么做:我已经有一段时间没有使用SDL了,但我非常确定SDL_Quit只是清理屏幕表面(您在开始时设置的主屏幕缓冲区)。必须释放手动创建的其他曲面,否则会出现泄漏。当然,因为它们已经是类成员了,一种简单的方法就是在类析构函数中释放它们。最好清除所有已知正在使用SDL_FreeSurface()的曲面
类似地,如果创建一个指针数组,所有指针都调用malloc,因此占用堆空间,那么退出程序将不会清除每个系统上所有已使用的空间
int **memspots[1024];
for (i = 0; i < 1024; i++) {
memspots[i] = malloc(1 * sizeof(int *)); // 1024 pointers to ints stored in heap memory
}
我查看了sdl1.2.15源代码,查看调用
SDL\u Quit
时实际发生的情况。正确:SDL\u Quit
将仅释放由SDL\u SetVideoMode
返回的主SDL\u曲面
原因如下:
SDLQuit
调用SDLQuitSubSystem
退出每个子系统SDLQuitSubSystem
将调用多个subsystem quit函数
- 特别地,调用了SDL\u VideoQuit
SDL\u VideoQuit
首先检查静态全局指针当前\u video
是否为空。
- 如果
不为空,则函数会先清除多个全局变量current\u video
在SDL\u自由曲面
或SDL\u阴影曲面
SDL\u视频曲面
或SDL\u ShadowSurface
初始化并从SDL\u VideoSurface
SDL\u SetVideoMode
SDL_FreeSurface
仅在由SDL_SetVideoMode
初始化的主SDL_曲面上调用,因此我们可以推断,分配内存的所有其他SDL_曲面变量不会通过调用SDL_Quit
释放,因此必须通过显式调用SDL_FreeSurface
释放
但是,由于通常对于所有程序,操作系统在程序结束时都会自动释放内存,因此释放SDL_表面变量只是一个问题,如果您的程序在退出SDL_后继续执行是的,在析构函数中释放表面并不困难,这只意味着跟踪类的每个实例,因为大多数类实例都会一直保留到程序退出为止。谢谢想想看,在
main()
完成之后,所有的东西都超出了范围,所以所有的析构函数都会在退出时被调用。因此,无需跟踪每个实例!当然,如果我错了,请纠正我。是的,您是正确的——除非包含类本身是动态分配的(在这种情况下,您当然必须删除它们),否则当对象超出范围时,所有内容都将自动释放,如您所述。
for (i = 0; i < 1024; i++) {
free(memspots[i]);
}
if (surface != NULL) // Will be NULL if everything failed and SOMEHOW managed to get here
SDL_FreeSurface();
return;