如何在功能中释放内存

时间:2012-03-26 18:31:53

标签: c++ memory sdl free

所以我的问题是如何释放此功能中的“输入”和“输出”。

void DSprite(
        SDL_Surface* Input, 
                SDL_Surface* Output,
                int InputX, int InputY, 
                int InputWidth, int InputHeight,
                int OutputX, int OutputY,
                bool FollowCamera
               )
{
... code

// Free.

SDL_FreeSurface(Input);
   Input=NULL;
   SDL_FreeSurface(Output);
   Output=NULL;

}

没有这个免费部分。 我的游戏内存使用速度非常快,从20 000秒内的9 000 K增加到20多万K!这个功能有问题吗?它被称为每帧多次。如何释放它?

但随之而来。 这不起作用。经过几秒钟的运行后,游戏会在第一帧被冻结,而第一帧应该被绘制。弹出这个错误。

Windows has triggered a breakpoint in game.exe.

This may be due to a corruption of the heap, which indicates a bug in game.exe or any of the DLLs it has loaded.

This may also be due to the user pressing F12 while game.exe has focus.

The output window may have more diagnostic information.

如果它是正确的?

void DText(TTF_Font *FontIn,const char* TextIn, (...)
{
(...)

SDL_Surface* TextSurf = TTF_RenderText_Solid(FontIn,TextIn,ColorIn);

(...)

//Free

TTF_CloseFont(FontIn);
FontIn=NULL;

SDL_FreeSurface(TextSurf);

free((char*)TextIn);
}

1 个答案:

答案 0 :(得分:2)

输入和ouptut如何用于您的程序?代码做了什么(我的意思是什么......代码)? 确实存在一些错误,您可以在从函数返回之前给出输入和输出并释放它们。

从变量名称,我不认为需要释放Ouput表面。因为它在执行sdl_blit时会崩溃(或者如果使用双缓冲区则为sdl_flip),因为你想要blit的表面是一个NULL指针。

C / C ++内存管理: 有两种类型的内存分配。静态和动态。

静态的是在代码

中声明变量
int a;
char b;
// Or even SDL strucutre
SDL_Surface Surface;

为了使它非常简单,当程序启动时,将分配这个内存(如果我没错,那就是我们称之为堆栈内存)。程序将处理那些变量内存。因此,您永远不应该尝试手动释放这些变量,这会导致程序崩溃。

第二个内存分配是动态分配。它允许您根据需要分配两个内存(在堆内存中)。它可以使用各种方法完成,如malloc,calloc等...(新函数仅在C ++中可用)。您需要释放分配的内存,否则将创建所谓的内存泄漏。

//Example
int* anArray = new int[10]; // I allocated a table of 10 char
// To free
delete  [] anArray;

关于你的要求,创建一个全局变量SDL_Surface surface。 SDL_Surface是一个结构,这意味着它是一个包含变量的“框”。由于SDL的工作原理,应使用SDL_CreateRGBSurface或此类其他功能创建SDL表面。而且由于它是如何工作的,你需要使用SDL_FreeSurface来释放表面(主要是因为SDL_Surface包含一个动态的像素数组,所以为了使管理更容易,SDL人员创建了一个函数来清理以前创建的表面)。

因此SDL_Surface是一个很大的变量,因为它是动态分配的,所以你可以使用指针来表示SDL_Surface类型的变量。

SDL_Surface * mysurface;

如果您将变量创建为全局,则意味着您要在多个函数中使用它。所以不要在函数中释放它。

但是如果你创建了

SDL_Surface mysurface; // No pointer a standard static allocation

不要试图释放它

此致

问候