我正在阅读使用Derelict和D的SDL教程系列(用C ++编写)。到目前为止,转换很简单,但教程编写风格的一个元素困扰着我,我一直试图弄清楚最佳方式。但是我对D的了解不是最好的,所以我不确定要处理这个问题。
基本上,要使用SDL,我必须将图像文件作为SDL_Surfaces加载到内存中。在程序退出之前,需要使用SDL_FreeSurface()手动释放这些曲面。这似乎是scope(exit)
的理想情况,实际上它确实非常有效......用于在单个函数的范围内加载和卸载资源。但理想情况下,我将所有这些分开,以便一个函数处理加载,然后在其他地方另一个函数释放它们。除此之外,每个资源可能只是处理自己。我想那是RAII,但我真的不明白如何在D中使用它。
我认为您只是设置了一个新类来承载资源,将其加载到this()
并在~this()
中释放它但似乎我读到了析构函数不能保证被调用,除非您将该类实例为scope
。我可以使用一个结构,但是如果我这样做,我似乎会错过类的有用好处。
我想要的是加载资源并获得有关它们被释放的保证,但是要以理智的方式这样做,不要求我将所有加载和卸载放在一个巨大的方法中。我该怎么做呢?
答案 0 :(得分:3)
我很确定 - 至少在具有多任务操作系统的平台上 - 您不必担心应用程序退出时的清理工作。
或者,您可以简单地将所述资源存储在全局集中。
答案 1 :(得分:2)
如果您想要的是自动释放SDL_Surface,您应该将SDL_Surface包装在结构中并利用RAII。它非常适合这种类型的东西。请务必禁用postblit以避免双重释放或实现引用计数。
struct SurfaceRAII
{
this(SDL_Surface* surf_handle)
{
m_handle = surf_handle;
}
// disable default constructor and postblit (no copies)
@disable this();
@disable this(this);
~this()
{
SDL_FreeSurface(m_handle);
}
public SDL_Surface* m_handle;
}
未经测试,但这是一般的想法。
编辑:如果您愿意,也可以在课程中使用std.typecons.RefCounted。