Сбой программы во время наложения текстуры

В настоящее время я тестирую класс 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] указывает на адрес, который больше не выделен.

Другие вопросы по тегам