Ошибка сегментации при использовании SDL с C ++, попытка Blit изображений - PullRequest
1 голос
/ 04 декабря 2008

ОК - у меня есть интересный здесь. Я работаю над клоном тетриса (в основном, чтобы «повысить уровень» моих навыков). Я пытался реорганизовать свой код, чтобы абстрагировать его так, как я этого хотел. В то время как раньше все работало нормально, теперь я получаю ошибку сегментации, прежде чем какие-либо изображения можно будет стереть. Я попытался отладить его безрезультатно.

Я разместил свою SVN рабочую копию проекта здесь .

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

Редактировать: Насколько я могу судить, то, что у меня есть сейчас, и то, что у меня было раньше, логически совпадают, поэтому я не думаю, что то, что у меня сейчас, вызовет ошибку сегментации. Просто запустите svn revert для рабочей копии, перекомпилируйте, и вы увидите, что она работает ...

Ответы [ 3 ]

4 голосов
/ 04 декабря 2008

Посмотрите на строки с 15 по 18 Surface.cpp:

    surface = SDL_DisplayFormatAlpha( tempSurface );
    surface = tempSurface;
}
SDL_FreeSurface( tempSurface );

Я предполагаю, что это происходит с ошибками, потому что когда вы используете эту поверхность позже, вы фактически работаете с tempSurface из-за этой строки:

surface = tempSurface;

а не поверхность, возвращаемая SDL_DisplayFormatAlpha (). Поскольку вы освободили tempSurface, поверхность теперь указывает на недопустимую память. Чтобы исправить, просто удалите вторую строку в блоке else.

0 голосов
/ 01 февраля 2015

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

0 голосов
/ 04 декабря 2008

У меня не установлен SDL на моей машине, но после просмотра кода.

Я заметил это в файле Output.cpp:

display = new Surface();

Ты ничего не делаешь. Конструктор для этого пуст. (поверхность не инициализирована).

Затем в Output :: initalize () вы делаете:

display->surface = SDL_SetVideoMode( 800, 600, 32, SDL_HWSURFACE | SDL_DOUBLEBUF );

Это похоже на то, что Surface :: surface фактически никогда не инициализировался. Если вы не нашли решение, когда я вернусь домой, я покопаюсь в нем.

...