3
#include <SDL/SDL.h>

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

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

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

4

4 回答 4

6

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

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

于 2013-07-20T06:05:53.873 回答
2

除了该指针本身之外,什么都没有分配在堆栈上。

于 2013-07-20T06:05:58.237 回答
0

加深理解:不能堆栈分配。原因很清楚 - 一个函数只能在更高的位置(从堆栈的角度看)堆栈分配数据,即在比它自己的堆栈帧更低的地址(被视为内存地址),即作为返回地址的位置被储存了。

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

如果函数返回一个然后仍然有效的指针,则该指针指向的内存必须位于“持久”数据空间中的某个位置,很可能在堆上。

于 2013-07-20T06:29:59.723 回答
0

SDL_SetVideoMode 是否分配任何内存或是否返回指向预分配内容的指针?从某种意义上说,这真的没关系,因为(我假设)这段代码运行并且进程退出,在这种情况下,所有进程内存都会返回给操作系统。

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

于 2013-07-20T06:08:27.683 回答