1

(注意:我用 Pascal 编码)

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

quests.Add( CPopuQuest.create('Get money ! ','Get more than $10,000', IMG_LOAD(MONEY_ICON), 1000, 10) ); (有趣的部分是IMG_LOAD(MONEY_ICON)MONEY_ICON 是图像的路径。

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

if badge<>nil then SDL_FreeSurface(badge)

(徽章是复制由 IMG_LOAD(MONEY_ICON) 实例化的 pSDL_Surface 的属性)

它在大多数情况下都可以工作,但是有时我在关闭程序时仍然会出错...如果有人可以提供帮助:)(如您所见,我对 IMG_LOAD 的工作方式,返回的内容和调用时如何分配内存)。

4

2 回答 2

1

任何IMG_Load返回的东西都可以安全地传递给SDL_FreeSurface,即使它返回一个空指针。(因此,您无需badge <> nil在调用之前进行检查SDL_FreeSurface(badge)。)

如果您在调用 时程序崩溃SDL_FreeSurface,那是由于您的程序中存在其他问题。该函数是释放任何IMG_Load加载内容的正确方法。这个问题中显示的一切都是正确的。

于 2012-04-17T22:15:19.077 回答
0

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

于 2012-04-19T14:21:20.857 回答