Loading...
MartinBG avatar MartinBG 4803 Точки

[Image layering and Hardware Accelerated Rendering] Възможен SDL_Surface лийк в Тexture::createTextureFromSurface

 В Тexture::createTextureFromSurface няма да извикаме freeSurface метода, ако SDL_CreateTextureFromSurface не успее да създаде текстурата.

Фикс:

int32_t Тexture::createTextureFromSurface(SDL_Surface*& inOutSurface, SDL_Texture*& outTexture) {
  outTexture = SDL_CreateTextureFromSurface(gRenderer, inOutSurface);
  freeSurface(inOutSurface); // <- add

  if (!outTexture) {
    logger::log("SDL_CreateTextureFromSurface() failed. Reason: ", SDL_GetError());
    return EXIT_FAILURE;
  }

  //freeSurface(inOutSurface); <- delete

  return EXIT_SUCCESS;
}

 

Тагове:
1
C++ Applications Development
bonev_st avatar bonev_st 13 Точки

Не мисля, че е необходимо да се освобождава ресурс, който не е създаден. Не съм гледал кода на SDL, но логиката би трябвало да е, ако извикването на функция даде грешка, състоянието да бъде каквото е било преди извикването. В този случай какъв ресурса зад nullptr?

0
MartinBG avatar MartinBG 4803 Точки

В имплементацията от лекциите SDL_Surface пойнтъра (inOutSurface) се създава и подава отвън на createTextureFromSurface, като се очаква да бъде освободен след като от него се създаде текстура.

SDL_CreateTextureFromSurface може да фейлне при създаването на SDL_Texture* (outTexture) и в този случай createTextureFromSurface ще върне EXIT_FAILURE преди да извика freeSurface, който от своя страна извиква SDL_FreeSurface.

0
10/11/2021 14:15:05
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.