所以我一直在阅读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