Как освободить память в функции - PullRequest
1 голос
/ 26 марта 2012

Так что моя проблема в том, как освободить «Вход» и «Выход» в этой функции.

void DSprite(
        SDL_Surface* Input, 
                SDL_Surface* Output,
                int InputX, int InputY, 
                int InputWidth, int InputHeight,
                int OutputX, int OutputY,
                bool FollowCamera
               )
{
... code

// Free.

SDL_FreeSurface(Input);
   Input=NULL;
   SDL_FreeSurface(Output);
   Output=NULL;

}

Без этой бесплатной части. Использование памяти в моей игре растет очень быстро, с 9 000 К до более 200 000 К за 20 секунд! Эта функция - проблема? Это называется каждый кадр много раз. Как это бесплатно?

Но с этим. Это не работает После нескольких секунд бега игра останавливается на первом кадре, который должен быть нарисован. И эта ошибка выскакивает.

Windows has triggered a breakpoint in game.exe.

This may be due to a corruption of the heap, which indicates a bug in game.exe or any of the DLLs it has loaded.

This may also be due to the user pressing F12 while game.exe has focus.

The output window may have more diagnostic information.

А если это правильно?

void DText(TTF_Font *FontIn,const char* TextIn, (...)
{
(...)

SDL_Surface* TextSurf = TTF_RenderText_Solid(FontIn,TextIn,ColorIn);

(...)

//Free

TTF_CloseFont(FontIn);
FontIn=NULL;

SDL_FreeSurface(TextSurf);

free((char*)TextIn);
}

1 Ответ

2 голосов
/ 26 марта 2012

Как вход и выход используются для вашей программы?Что делает код (я имею в виду, что такое ... код)?Там определенно что-то не так, вы даете ввод и вывод и освобождаете их перед возвращением из функции.

Из имени переменной я не думаю, что поверхность 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

Не пытайтесь освободить его

С уважением

С уважением

...