Ошибка сегментации при использовании SDL с C ++, попытка Blit изображений
Вопрос
Хорошо - у меня есть интересный здесь. Я работаю над клоном тетриса (в основном для & Повышения уровня &; Моих навыков). Я пытался реорганизовать свой код, чтобы абстрагировать его так, как я этого хотел. В то время как раньше все работало нормально, теперь я получаю ошибку сегментации, прежде чем какие-либо изображения можно будет стереть. Я попытался отладить его безрезультатно.
Я разместил свою рабочую копию проекта SVN здесь а>. р>
Это всего лишь небольшой проект, и кто-то с большим знанием, чем я, и хороший отладчик, вероятно, поймут это в одно мгновение. Единственная зависимость - это SDL . Слава человеку, который может сказать мне, что я делаю не так. Редактировать. Насколько я могу судить, то, что у меня есть сейчас, и то, что у меня было раньше, логически совпадают, поэтому я не думаю, что то, что у меня сейчас, вызовет ошибку сегментации. Просто запустите svn revert для рабочей копии, перекомпилируйте, и вы увидите, что она работает ...
Решение
Посмотрите на строки с 15 по 18 в Surface.cpp:
surface = SDL_DisplayFormatAlpha( tempSurface );
surface = tempSurface;
}
SDL_FreeSurface( tempSurface );
Я предполагаю, что это происходит с ошибками, потому что когда вы используете эту поверхность позже, вы фактически работаете с tempSurface из-за этой строки:
surface = tempSurface;
, а не поверхность, возвращаемая SDL_DisplayFormatAlpha (). Поскольку вы освободили tempSurface, поверхность теперь указывает на недопустимую память. Чтобы исправить это, просто удалите вторую строку в блоке else.
Другие советы
У меня не установлен SDL на моем компьютере, но после просмотра кода.
Я заметил это в файле Output.cpp:
display = new Surface();
Ты ничего не делаешь. Конструктор для этого пуст. (поверхность не инициализирована).
Затем в Output :: initalize () вы делаете:
display->surface = SDL_SetVideoMode( 800, 600, 32, SDL_HWSURFACE | SDL_DOUBLEBUF );
Похоже, проблема Surface :: surface никогда не была инициализирована. Если вы не нашли решение, когда я вернусь домой, я покопаюсь в нем.
Насколько я понимаю, ошибка сегментации возникает, когда вы пытаетесь манипулировать понтером, который больше не доступен, или вы пытаетесь изменить значение константы.