Ошибка сегментации при использовании SDL с C ++, попытка Blit изображений

StackOverflow https://stackoverflow.com/questions/341192

  •  19-08-2019
  •  | 
  •  

Вопрос

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

Я разместил свою рабочую копию проекта 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 никогда не была инициализирована. Если вы не нашли решение, когда я вернусь домой, я покопаюсь в нем.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top