2015-06-06 7 views
-2

В настоящее время я тестирую класс TextureManager, который я буду использовать в своем игровом проекте, но проблема в том, что .exe сработает, когда я пытаюсь загрузить 2d-текстуры в std :: map , Что мне нужно, что у меня есть карта указателей на SDL_Textures, заклиненную со стандартной строкойСбой программы во время отображения текстуры

std::map<std::string, SDL_Texture*>Textures; 

СВД и 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); 

} 

Естественно, текстуры Карта является частным членом класса TextureManager. Не имеет значения, вызвана ли функция конструктором TextureManager или позже указателем на TextureManager - тем же результатом. В предыдущей версии этого загрузчика не отображались текстуры, карта вообще не использовалась, и она работала нормально. Виновата ли карта? Это единственная разница между версиями ...

Редактировать: Я добавил дополнительный комментарий к последней строке кода и «прокомментировал» ее, так как после того, как я протестировал предложения, это причина ошибки, поведение программы не изменилось, поэтому это должно быть что-то еще.

EDIT2: ОК, я решил проблему - случилось, что одна из поверхностей была загружена из файла .jpg, и по какой-либо причине файл библиотеки jpg sdl был поврежден. Поэтому поддержка JPG не была инициализирована во время выполнения, и попытка загрузить файл jpg привела к сбою exe. Замена .dll в папке проекта решила проблему - все работает, как ожидается, в настоящее время

+0

Где он падает? Потому что, если вы уничтожаете текстуру после ее загрузки, то ссылайтесь на текстуру, что, очевидно, приведет к неожиданным результатам. –

+0

_ @ Quit_ какие аномалии вы наблюдали при использовании отладчика для выполнения вашего программного кода? –

ответ

0
Textures[id] = newTexture; 
SDL_DestroyTexture(newTexture); 

Это оставляет указатель на текстуру, которая была освобождена внутри (структуры данных или сходными вы используете) map<std::string, SDL_Texture*> , Вы должны уничтожить текстуру только тогда, когда вам больше не нужно, а не только после ее загрузки.

Это оборванный указатель, потому что SDL_CreateTextureFromSurface возвращает адрес для действительного SDL_Texture экземпляра, который становится недействительным после его уничтожения, поэтому Textures[id] указует на адрес, который больше не выделен.

+0

Я подозревал, что это может быть причиной будущей проблемы, поэтому я пометил его комментарием для справки. Однако это не является причиной проблемы. Я построил exe без этой строки, и поведение не изменилось. Функция load(), кажется, немедленно сбивает программу - я добавил printf после успешной загрузки IMG и SDL createTexture, ни одна из них не появляется в консоли – Quit

Смежные вопросы