Ошибка сегментации SDL в C ++ (ядро сброшено)

В настоящее время я учусь кодировать на SDL, используя C ++ в качестве базового языка программирования.

В общем, что происходит, у меня есть кусок кода с циклом внутри, который будет отображать изображение, пока цикл не начнется снова. Цикл длится 5 секунд, и в программе есть итератор i, установленный в 0, который увеличивается с каждым циклом, пока не достигнет пяти, когда выйдет из цикла через разрыв. Затем SDL завершает работу, как ожидается, и программа завершается.

Там нет ошибок компиляции, только к вашему сведению. Когда я запускаю программу, основной цикл запускается один раз, а затем появляется программа, которая сама закрывается, выводя в окне моего терминала сообщение «Ошибка сегментации (ядро сброшено)».

Что это значит, и что можно сделать, чтобы этого не произошло? Заранее спасибо.

РЕДАКТИРОВАТЬ: код этот, извините за то, что не написал раньше. Я пишу это по памяти, так как сейчас меня нет дома.

#include <iostream>
#include <SDL.h>

int main( int argc, char** argv )
{
SDL_Surface* media;
SDL_Surface* window;

int i = 0;

SDL_Init( SDL_INIT_EVERYTHING );
window = SDL_SetVideoMode( 1920, 1080, 32, SDL_SWSURFACE );
media = SDL_LoadBMP( "xD.bmp" );

while( true )
{
SDL_BlitSurface( media, NULL, window, NULL );
SDL_Delay( 5000 );

if( i == 5 )
{
break;
}

i++;
}

SDL_FreeSurface( media );
SDL_Quit( );

return 0;
}

РЕДАКТИРОВАТЬ 2: предыдущий, если (я = 5) был типографский и был исправлен.

РЕДАКТИРОВАТЬ 3: Я прибыл домой и проверил мой код. Я не печатал if (i=5) Я счастлив, потому что это довольно глупая ошибка. Я также попытался уменьшить размер окна безуспешно, поэтому мы вернулись к основной проблеме.
Кроме того, я попытался удалить цикл, и программа запускается и во время закрытия выдает ошибку, так что, по крайней мере, это не ошибка цикла. Но сейчас это большая проблема. Кстати, я выложу реальный скомпилированный код, потому что предыдущий был написан по памяти.

#include <iostream>
#include <SDL/SDL.h>

int main (int argc, char** argv)
{
SDL_Surface*  window;
SDL_Surface* media;int i;

SDL_Init (SDL_INIT_EVERYTHING);
window = SDL_SetVideoMode (2058, 1152, 32, SDL_SWSURFACE);
media = SDL_LoadBMP("xD.bmp");
while (true)
{
i++;
SDL_BlitSurface(media, NULL, window, NULL);
SDL_Flip(window);
SDL_Delay(5000);
SDL_FreeSurface(media);

if (i==5)
{
break;
}

}
SDL_FreeSurface(media);
SDL_Quit();
return 0;
}

Я просто надеюсь, что это происходит только со мной, потому что это довольно запутанная вещь, чтобы исправить.
Мир, ребята.

1

Решение

SDL_FreeSurface(media); на каждой итерации цикла, а затем еще раз после цикла прерывается. Это неправильно, после free media является висящим указателем и больше не указывает на правильное местоположение. Удалите это из цикла, нет никаких причин держать его там.

Также, как было указано в комментарии к вопросу, проверьте значения window а также media, Нет гарантии, что изображение существует и может быть загружено, поэтому оно может быть NULL,

0

Другие решения

the main loop is run one single time and then the programs appears to close it self

Если это не опечатка, то измените

if( i = 5 )

в

if( i == 5 )

i = 5 операция всегда будет оценивать TRUE и таким образом вызвать break, Помимо этого, программа работает на моем компьютере без ошибок сегментации.

2

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

int array[5];
array[20] = 0;

Поскольку вы обращаетесь к памяти, к которой у вас нет доступа (она не была объявлена), вы получите ошибку сегментации. Это также может произойти с утечками памяти, если вы пытаетесь объявлять объекты динамически.

Что именно внутри цикла? Я не совсем уверен, что вызвало бы это, если вы не обращаетесь к какой-то части памяти, к которой у вас нет доступа. Попробуйте запустить отладчик и посмотрите, какая именно строка кода дает сбой.

-4
По вопросам рекламы [email protected]