Сбой программы во время наложения текстуры
В настоящее время я тестирую класс TextureManager, который буду использовать в своем игровом проекте, но проблема в том, что у меня происходит сбой.exe, когда я пытаюсь загрузить 2d текстуры в std::map. Что мне нужно, так это то, что у меня есть карта указателей на SDL_Textures, снабженная стандартной строкой
std::map<std::string, SDL_Texture*>Textures;
SDL и SDL_image инициализируются нормально (успешное выполнение printfs в консоли), но затем запускается сопоставление текстур и происходит сбой программы, как только вызывается функция load(). Ниже реализация функции
void TextureManager::load( std::string path, std::string id )
{
SDL_Surface* TempSurface = IMG_Load( path.c_str() );
if( TempSurface == NULL )
{
printf( "Failed to load %s: error: %s\n", path.c_str(), IMG_GetError() );
}
/* add color coding if necessary here
SDL_SetColorKey( TempSurface, SDL_TRUE, SDL_MapRGB( TempSurface->format, 0, 0xFF, 0xFF ) );
*/
SDL_Texture* newTexture = SDL_CreateTextureFromSurface( renderer, TempSurface );
if( newTexture == NULL )
{
printf( "Failed to create a texture %s: error: %s\n", id.c_str(), SDL_GetError() );
}
SDL_FreeSurface( TempSurface );
Textures[ id ] = newTexture;
printf( "Texture %s mapped successfully", id.c_str() );
//possible error - not the cause of the described error
//SDL_DestroyTexture( newTexture );
}
Естественно, карта Textures является частным членом класса TextureManager. Неважно, если функция вызывается конструктором TextureManager или позже указателем на TextureManager - тот же результат. Предыдущая версия этого загрузчика не отображала текстуры, карта вообще не использовалась и работала просто отлично. Виновата ли тогда карта? Это единственная разница между версиями...
редактировать: я добавил дополнительный комментарий к последней строке кода и "закомментировал" его, так как после того, как я проверил предложения, это является причиной ошибки, поведение программы не изменилось, поэтому должно быть что-то еще.
РЕДАКТИРОВАТЬ 2: ОК, я решил проблему - случилось, что одна из поверхностей была загружена из файла.jpg и по какой-то причине файл библиотеки jpg sdl был поврежден. Поэтому поддержка JPG не была инициализирована во время выполнения, и попытка загрузить файл jpg приводила к сбою exe. Замена.dll в папке проекта решила проблему - теперь все работает как положено
1 ответ
Textures[id] = newTexture;
SDL_DestroyTexture(newTexture);
Это оставляет указатель на текстуру, которая была освобождена внутри map<std::string, SDL_Texture*>
(или аналогичная структура данных, которую вы используете). Вы должны уничтожать текстуру только тогда, когда она вам больше не нужна, а не только после ее загрузки.
Это висящий указатель, потому что SDL_CreateTextureFromSurface
возвращает адрес действительному SDL_Texture
экземпляр, который становится недействительным после его уничтожения, так Textures[id]
указывает на адрес, который больше не выделен.