Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在SDL中,SDL_Quit()是否释放每个曲面?_C++_C_Sdl_Surface - Fatal编程技术网

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;