2013-12-15 2 views
0

Я начинаю с C++, и эта функция заставляет память моей программы постоянно поднимать.Я использую SDL, и эта функция заставляет мою программу использовать всю мою память.

Он называется в цикле while, и он никогда не останавливается.

void text_box() 
{ 
    SDL_Surface *MESSAGE1 = TTF_RenderText_Solid(font, "Ligne #1" , noir);      
    SDL_Surface *MESSAGE2 = TTF_RenderText_Solid(font, "Ligne #2" , noir); 
    SDL_Surface *MESSAGE3 = TTF_RenderText_Solid(font, "Ligne #3" , noir); 
    SDL_Surface *MESSAGE4 = TTF_RenderText_Solid(font, "Ligne #4" , noir); 
    SDL_Surface *MESSAGE5 = TTF_RenderText_Solid(font, "Ligne #5" , noir); 
    SDL_Surface *MESSAGE6 = TTF_RenderText_Solid(font, "Ligne #6" , noir); 
    SDL_Surface *MESSAGE7 = TTF_RenderText_Solid(font, "Ligne #7" , noir); 
    SDL_Surface *MESSAGE8 = TTF_RenderText_Solid(font, "Ligne #8" , noir); 
    SDL_Surface *MESSAGE9 = TTF_RenderText_Solid(font, "Ligne #9" , noir); 
    SDL_Surface *MESSAGE10 = TTF_RenderText_Solid(font, "Ligne #10" , noir); 
    apply_surface(0, 403, MESSAGE1, SCREEN); 
    apply_surface(0, 412, MESSAGE2, SCREEN); 
    apply_surface(0, 421, MESSAGE3, SCREEN); 
    apply_surface(0, 429, MESSAGE4, SCREEN); 
    apply_surface(0, 438, MESSAGE5, SCREEN); 
    apply_surface(0, 447, MESSAGE6, SCREEN); 
    apply_surface(0, 456, MESSAGE7, SCREEN); 
    apply_surface(0, 465, MESSAGE8, SCREEN); 
    apply_surface(0, 474, MESSAGE9, SCREEN); 
    apply_surface(0, 483, MESSAGE10, SCREEN); 
} 

Он поднимается линейным образом, пока осталось больше памяти.

ответ

2

TTF_RenderText_Solidreturns a pointer to a new SDL_Surface.

Вы должны free эту поверхность, когда вы сделали с ним.

В данном конкретном случае, так как текст не меняется, и я предполагаю, font и noir фиксированы, вы можете инициализировать Сообщение1 через MESSAGE10 один раз, и использовать их, как это было предложено Bartlomiej Левандовски ниже. Тогда вам нужно только освободить поверхности, если вы достигнете части своей программы, где они больше не нужны для отображения.

+0

или даже лучше, сделайте это один раз и передайте его как параметр –

+0

@BartlomiejLewandowski: И какой параметр это будет? Я не вижу параметр «SDL_Surface *» в API. –

+0

Я имею в виду, передайте его функции 'text_box()'. Текст не изменяется, поэтому нет необходимости создавать новую поверхность в каждом цикле. –

Смежные вопросы