这是一个基于堆栈的内存

时间:2013-07-20 06:00:47

标签: c

#include <SDL/SDL.h>

int main (void)
{
  SDL_Surface* screen;
  screen=SDL_SetVideoMode(640, 480, 32, SDL_SWSURFACE);
  return 0;
}

screen是指向后台缓冲区的指针,用于绘制,需要相当多的内存。

我的问题,屏幕定义就像是基于堆栈的内存,因为堆内存会使用malloc。由于堆栈内存有限,因此上面的代码很糟糕,因为它占用了大量有限的堆栈内存,而应该使用堆内存。但是这段代码来自开源代码,我认为他们知道自己在做什么。

4 个答案:

答案 0 :(得分:6)

此处,screen是指向动态分配的SDL_Surface结构的指针,该结构本身具有指向实际像素数据的成员void* pixels。指针只占用4或8个字节的堆栈空间,具体取决于您是分别使用32位还是64位系统。

当您致电SDL_Quit()时,SDL会释放主视频表面,但是当您使用SDL_CreateRGBSurface()自行分配表面时,必须调用SDL_FreeSurface()来释放内存。您还可以在SDL_Surface中找到SDL_video.h的声明,以获取其成员的完整列表。

答案 1 :(得分:2)

除了指针本身之外没有任何东西在堆栈上分配。

答案 2 :(得分:0)

SDL_SetVideoMode是否分配了任何内存,或者它是否返回指向预先分配的内容的指针?在某种意义上,它确实无关紧要,因为(我会假设)此代码已运行并且进程退出,在这种情况下,所有进程内存都将返回到操作系统。

(请注意,“内存返回操作系统”并不十分准确,因为每个进程都有自己的虚拟地址空间等等......并且“返回”该内存只是意味着以前分配给该进程虚拟的任何实际内存记忆可以在其他地方自由使用。)

答案 3 :(得分:0)

增强理解:不能进行堆栈分配。原因很清楚 - 一个函数只能在更高的位置堆栈分配数据(从堆栈的角度来看),i。即在低于其自身堆栈帧的地址(被视为存储器地址),i。即作为存储返回地址的位置。

这意味着从函数返回后,它在堆栈上分配的所有内存都必须(并且将)被释放。

如果函数返回一个指针然后仍然有效,则该指针指向的内存必须位于&#34; persistent&#34;数据空间,很可能在堆上。