c++ - 在 SDL 中,SDL_Quit() 会释放每个表面吗?

标签 c++ c sdl surface

基本上,在程序终止之前将一直存在的表面上,我是否需要为每个表面运行 SDL_FreeSurface(),或者 SDL_Quit()为我处理这一切?

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

最佳答案

我查看了 SDL 1.2.15 源代码,以了解在调用 SDL_Quit 时实际发生了什么。 Gemini14's answer是正确的:SDL_Quit 只会释放 SDL_SetVideoMode 返回的主 SDL_Surface。

原因如下:

  1. SDLQuit 调用SDLQuitSubSystem 退出每个子系统
  2. SDLQuitSubSystem 会调用几个子系统退出函数
    • 特别是调用了 SDL_VideoQuit
  3. SDL_VideoQuit 首先检查静态全局指针 current_video 是否不为 NULL。
    • 如果 current_video 不为 NULL,则该函数会先清除几个全局变量。
    • SDL_FreeSurfaceSDL_ShadowSurfaceSDL_VideoSurface 上调用
      • SDL_ShadowSurfaceSDL_VideoSurface 已初始化并从 SDL_SetVideoMode 返回

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

但是,由于通常对于所有程序,操作系统都会在程序结束时自动释放内存,因此如果您的程序在 SDL_Quit 之后继续运行,释放 SDL_Surface 变量只是一个问题。

关于c++ - 在 SDL 中,SDL_Quit() 会释放每个表面吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3099229/

相关文章:

c++ - SFINAE on Error in Dependent Type 导致意外的硬错误

c++ - 调试以 CREATE_SUSPENDED 启动的任何进程时很少出现 EXCEPTION_ACCESS_VIOLATION

c++ - 神秘的 C++ "thing"(函数指针)

调用 malloc() 会覆盖静态表

sdl - 使用 Derelict SDL 时出现段错误

c++ - 在C++中将数组传递给函数

c++ - 英特尔编译器 (ICC) 无法自动矢量化内部循环(矩阵乘法)

c - iso_c_binding 使用来自 Fortran 的指针和数组调用 C 例程

c++ - 带有 SDL 的对话框/消息框?

C++:如何添加外部库