4

基本上,在程序终止之前将存在的表面上,我是否需要SDL_FreeSurface()为每个表面运行,还是会SDL_Quit()为我处理所有这些?

我问主要是因为指向我的许多表面的指针是类成员,因此如果我想SDL_FreeSurface()在它们各自的表面上运行,我需要跟踪每个类实例(在全局数组或其他东西中)。如果 SDL_Quit() 会一举为我完成这一切,我宁愿继续这样做 :D

4

3 回答 3

4

我查看了SDL 1.2.15源代码以了解SDL_Quit调用时实际发生的情况。Gemini14 的回答是正确的:SDL_Quit只会释放由SDL_SetVideoMode.

原因如下:

  1. SDLQuit调用SDLQuitSubSystem退出每个子系统
  2. SDLQuitSubSystem将调用几个子系统退出函数
    • 特别SDL_VideoQuit是被称为。
  3. SDL_VideoQuit首先检查静态全局指针current_video是否不为 NULL。
    • 如果current_video不为 NULL,该函数会先清理几个全局变量。
    • SDL_FreeSurface被调用SDL_ShadowSurfaceSDL_VideoSurface
      • SDL_ShadowSurfaceorSDL_VideoSurface被初始化并从SDL_SetVideoMode

由于SDL_FreeSurface仅在由 初始化的主 SDL_Surface 上调用SDL_SetVideoMode我们可以推断所有其他 SDL_Surface 变量分配的内存不会通过调用释放SDL_Quit,因此必须通过显式调用释放SDL_FreeSurface

但是,由于通常对于所有程序,操作系统会在程序结束时自动释放内存,因此只有在您的程序在SDL_Quit.

于 2013-07-03T18:07:55.287 回答
2

自从我使用 SDL 已经有一段时间了,但我很确定 SDL_Quit 只是清理屏幕表面(您在开始时设置的主屏幕缓冲区)。您必须释放手动创建的其他表面,否则会出现泄漏。当然,由于它们已经是类成员,因此轻松做到这一点的一种方法是在类析构函数中释放它们。

于 2010-06-23T06:10:49.143 回答
1

使用 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
}

在您的应用程序结束时,您肯定希望以类似的方式调用 free。

for (i = 0; i < 1024; i++) {
  free(memspots[i]);
}

最好的做法是尽可能在任何时候释放任何使用的内存,无论是在运行时还是在退出时。

我的 SDL GL 纹理功能暂时使用 SDL_Surface 来收集一些图像数据(取自 SDL_image),并在最后:

  if (surface != NULL) // Will be NULL if everything failed and SOMEHOW managed to get here
    SDL_FreeSurface();

  return;
于 2010-06-23T10:22:49.477 回答