Как вход и выход используются для вашей программы?Что делает код (я имею в виду, что такое ... код)?Там определенно что-то не так, вы даете ввод и вывод и освобождаете их перед возвращением из функции.
Из имени переменной я не думаю, что поверхность Ouput должна быть освобождена.Потому что кажется, что происходит сбой при выполнении sdl_blit (или sdl_flip, если вы используете двойной буфер), потому что поверхность, которую вы хотите скопировать, является указателем NULL.
Управление памятью на C / C ++: Существует два типа выделения памяти,Статический и динамический.
Статический - когда вы объявляете переменную в коде
int a;
char b;
// Or even SDL strucutre
SDL_Surface Surface;
Чтобы сделать ее чрезвычайно простой, когда программа запустится, эта память будет выделена (если яне неправильно это то, что мы называем стековой памятью).Программа будет обрабатывать эти переменные в памяти.Поэтому никогда не пытайтесь вручную освобождать эти переменные, это приведет к сбою вашей программы.
Второе распределение памяти - динамическое.Это позволяет вам выделять память (в куче памяти) в соответствии с вашими потребностями.Это можно сделать с помощью различных методов, таких как malloc, calloc и т. Д. (Новая функция доступна только в C ++).Вы должны освободить выделенную память, так или иначе, вы создадите так называемую утечку памяти.
//Example
int* anArray = new int[10]; // I allocated a table of 10 char
// To free
delete [] anArray;
Что касается того, что вы спрашиваете, создайте глобальную переменную SDL_Surface surface
.SDL_Surface - это структура, что означает «ящик», содержащий переменные.Из-за того, как работает SDL, поверхность SDL должна быть создана с использованием SDL_CreateRGBSurface
или другой функции такого рода.А также из-за того, как это работает, вам нужно использовать SDL_FreeSurface
для освобождения поверхности (в основном потому, что SDL_Surface содержит динамический массив пикселей, поэтому для упрощения управления ребята из SDL создали функцию для очистки ранее созданной поверхности).
Таким образом, SDL_Surface - это большая переменная, и, поскольку она динамически выделяется, вы используете указатель для переменных типа SDL_Surface.
SDL_Surface * mysurface;
Если вы создали переменную как глобальную, что означает, что вы хотитеиспользовать его в более чем одной функции.Поэтому не освобождайте его в функции.
Однако, если вы создали
SDL_Surface mysurface; // No pointer a standard static allocation
Не пытайтесь освободить его
С уважением
С уважением