Освобождает ли SDL_Quit () каждую поверхность в SDL?

В принципе, на поверхностях, которые будут существовать прямо до завершения программы, нужно ли мне запускать SDL_FreeSurface() для каждой из них, или SDL_Quit() позаботится обо всем этом за меня?

Я спрашиваю в основном потому, что указатели на ряд моих поверхностей являются членами класса, и поэтому мне нужно было бы отслеживать каждый экземпляр класса (в глобальном массиве или что-то в этом роде), если бы я хотел запустить SDL_FreeSurface() на каждой из их соответствующих поверхностей. Если SDL_Quit () сделает все за меня одним махом, я бы предпочел пойти с этим: D


person Lewis    schedule 23.06.2010    source источник


Ответы (3)


Прошло много времени с тех пор, как я использовал SDL, но я почти уверен, что SDL_Quit просто очищает поверхность экрана (основной экранный буфер, который вы установили в начале). Вы должны освободить другие поверхности, которые вы создаете вручную, иначе вы получите утечки. Конечно, поскольку они уже являются членами класса, один из способов легко сделать это - просто освободить их в деструкторе класса.

person Gemini14    schedule 23.06.2010
comment
Да, освободить поверхность в деструкторе несложно, это просто означало бы отслеживание каждого экземпляра класса, поскольку большинство экземпляров класса остаются на месте до тех пор, пока программа не завершится. Спасибо! - person Lewis; 23.06.2010
comment
Если подумать, все выходит за рамки после выполнения main(), поэтому все деструкторы в любом случае будут вызываться при выходе. Так что не нужно отслеживать каждый экземпляр! Поправьте, конечно, если я ошибаюсь. - person Lewis; 24.06.2010
comment
Да, вы правы - если сам содержащий класс не выделяется динамически (в этом случае вы, конечно, должны удалить их), все будет автоматически освобождено, когда объект выйдет из области видимости, как вы упомянули. - person Gemini14; 24.06.2010

Я проверил исходный код SDL 1.2.15, чтобы увидеть, что на самом деле происходит при вызове SDL_Quit. Ответ Gemini14 правильный: SDL_Quit освободит только основную SDL_Surface, возвращенную SDL_SetVideoMode.

Вот почему:

  1. SDLQuit вызывает SDLQuitSubSystem для выхода из каждой подсистемы
  2. SDLQuitSubSystem will call several subsystem quit functions
    • In particular, SDL_VideoQuit is called.
  3. SDL_VideoQuit first checks if the static global pointer current_video is not NULL.
    • If current_video is not NULL, the function precedes to clean up several global variables.
    • SDL_FreeSurface is called on SDL_ShadowSurface or SDL_VideoSurface
      • SDL_ShadowSurface or SDL_VideoSurface is initialized and returned from SDL_SetVideoMode

Поскольку SDL_FreeSurface только вызывается на основной SDL_Surface, инициализированной SDL_SetVideoMode, мы можем предположить, что выделенная память для всех других переменных SDL_Surface не освобождается с помощью вызова SDL_Quit и, следовательно, должна быть освобожден явными вызовами SDL_FreeSurface.

Однако, поскольку обычно для всех программ операционная система автоматически освобождает память при завершении программы, освобождение переменных SDL_Surface вызывает беспокойство только в том случае, если ваша программа продолжается после SDL_Quit.

person Vilhelm Gray    schedule 03.07.2013

Лучше всего очистить все ваши поверхности, которые, как вы знаете, вы используете, с помощью 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
}

В конце вашего заявления вы определенно захотите позвонить бесплатно аналогичным образом.

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

Лучше всего освобождать всю используемую память в любое время, когда это возможно, будь то во время выполнения и, конечно же, при выходе.

Моя функция текстуры GL для SDL временно использует SDL_Surface для сбора некоторых данных изображения (взятых из SDL_image) и имеет это в конце:

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

  return;
person Tatsh    schedule 23.06.2010