所以我一直在閱讀lazyfoos SDL2教程,我只是好奇如何在堆上創建所有的SDL_Surface /紋理等?我意識到SDL本身是用C編寫的,函數接受/返回指針,但爲什麼不在堆棧上創建表面並將其引用傳遞給函數呢? (或分配時取消引用)SDL爲什麼要在堆上創建紋理而不是堆棧
希望我已經清楚。下面是一個代碼片段,以進一步嘗試解釋:
爲什麼:
void pointer()
{
SDL_Surface *windowsurface;
SDL_Surface *surface = SDL_LoadBMP("asdf.bmp");
SDL_BlitSurface(surface, 0, windowsurface, 0);
}
,而不是這樣的:
void stack()
{
SDL_Surface windowsurface;
SDL_Surface surface = *(SDL_LoadBMP("asdf.bmp"));
SDL_Blit(&surface, 0, &windowsurface, 0);
}
如果後者確實是可能的,你還需要調用SDL_FreeSurface?如果是這樣,這將確保你不會泄漏任何內存,所以我不太看到前者的好處。
希望這一切是有道理的,我還是個新人,當涉及到SDL
這很可能是因爲SDL的對象具有SDL庫必須跟蹤的內部資源。這要求SDL對象的所有實例化和銷燬都由庫直接完成,只有庫負責100%的對象生命週期管理;因此唯一可能的實現是基於堆的分配和銷燬。 –
所以我必須創建堆上的所有表面?我問的原因是因爲我有很多類作爲成員的紋理,並希望避免擔心複製構造函數和我的所有類的分配。 – picklechips
在第二個例子中,當函數退出時,'windowsurface'被銷燬。我會想象大多數紋理需要超越它們創建的功能。 – Galik