Memory management 如何释放作为IMG_加载(路径)参数显式复制的pSDL_曲面?

Memory management 如何释放作为IMG_加载(路径)参数显式复制的pSDL_曲面?,memory-management,sdl,pascal,Memory Management,Sdl,Pascal,(注意:我用Pascal编写代码) 在类TQuest的创建者中,我使用作为参数给定的pSDL_曲面初始化一些对象,如下所示: quests.Add(CPopuQuest.create('Get money!','Get over$10000',IMG_LOAD(money_图标),1000,10)) (有趣的部分是IMG\u加载(MONEY\u图标)带有MONEY\u图标的图像路径 当我结束我的程序时,我在这一行的CPopuQuest对象的析构函数处得到一个错误: 如果没有标记,则SDL_自由曲

(注意:我用Pascal编写代码)

在类
TQuest
的创建者中,我使用作为参数给定的pSDL_曲面初始化一些对象,如下所示:

quests.Add(CPopuQuest.create('Get money!','Get over$10000',IMG_LOAD(money_图标),1000,10))
(有趣的部分是
IMG\u加载(MONEY\u图标)
带有MONEY\u图标的图像路径

当我结束我的程序时,我在这一行的CPopuQuest对象的析构函数处得到一个错误:

如果没有标记,则SDL_自由曲面(标记)

(badge是复制IMG_LOAD(货币图标)实例化的pSDL_曲面的属性)


它大部分时间都能工作,但每次我关闭程序时都会出错……如果有人能帮忙的话:)(正如你所看到的,我对IMG_加载的工作原理、返回的内容以及调用时如何分配内存感到非常困惑)。

任何
IMG_加载
返回的内容都可以安全地传递到
SDL_FreeSurface
,即使它返回空指针。(因此,在调用
SDL\u FreeSurface(badge)
之前,无需检查
badge nil


如果在调用
SDL_FreeSurface
时程序崩溃,那么这是由于程序中的其他问题造成的。该功能是释放
IMG\u加载的任何内容的正确方法。此问题中显示的所有内容都是正确的。

任何
IMG\u Load
返回的内容都可以安全地传递到
SDL\u FreeSurface
,即使它返回空指针。(因此,在调用
SDL\u FreeSurface(badge)
之前,无需检查
badge nil


如果在调用
SDL_FreeSurface
时程序崩溃,那么这是由于程序中的其他问题造成的。该功能是释放
IMG\u加载的任何内容的正确方法。此问题中显示的所有内容都是正确的。

可能是内存泄漏。它可能不是表面,而是来自另一个代码。有一次,我犯了一个错误,访问一个数组超出边界,它会更改一个曲面,并让调色板指向非null(它应该为null),当我调用SDL_FreeSurface时,出现了一个错误。

可能是内存泄漏。它可能不是表面,而是来自另一个代码。有一次,我犯了一个错误,访问一个数组越界,它会更改一个曲面,并让调色板指向非空(它应该为空),当我调用SDL_FreeSurface时,出现了一个错误。

您的意图是让每个人都猜到您得到了什么错误吗?为什么您对
IMG\u Load
返回的内容感到困惑?我没有从你上面写的任何东西中得到那种印象。它简单地返回一个指向
SDL\u曲面的指针。难道你不知道为了申报
徽章
CPopuQuest.Create
?您使用的是什么文档?libsdl.org上的文档似乎非常简单。我对SDL(和Stackoverflow)非常陌生,尽管我还没有用它完成游戏的开发:);所以你可以原谅我问的这个不清楚的问题。我得到的错误类型是SIG…,记不清了。它并不总是发生,我不知道如何重现它,这就是为什么我没有给出确切的错误(但我确信它与析构函数的内存管理有关)。不管怎样,我将尝试查看代码并找到它的来源!你的意图是让每个人都猜到你犯了什么错误吗?为什么您对
IMG\u Load
返回的内容感到困惑?我没有从你上面写的任何东西中得到那种印象。它简单地返回一个指向
SDL\u曲面的指针。难道你不知道为了申报
徽章
CPopuQuest.Create
?您使用的是什么文档?libsdl.org上的文档似乎非常简单。我对SDL(和Stackoverflow)非常陌生,尽管我还没有用它完成游戏的开发:);所以你可以原谅我问的这个不清楚的问题。我得到的错误类型是SIG…,记不清了。它并不总是发生,我不知道如何重现它,这就是为什么我没有给出确切的错误(但我确信它与析构函数的内存管理有关)。不管怎样,我将尝试查看代码并找到它的来源!