使用Derelict和SDL管理D中外部资源的正确而明确的方法

时间:2011-12-21 21:23:31

标签: sdl d raii

我正在阅读使用Derelict和D的SDL教程系列(用C ++编写)。到目前为止,转换很简单,但教程编写风格的一个元素困扰着我,我一直试图弄清楚最佳方式。但是我对D的了解不是最好的,所以我不确定要处理这个问题。

基本上,要使用SDL,我必须将图像文件作为SDL_Surfaces加载到内存中。在程序退出之前,需要使用SDL_FreeSurface()手动释放这些曲面。这似乎是scope(exit)的理想情况,实际上它确实非常有效......用于在单个函数的范围内加载和卸载资源。但理想情况下,我将所有这些分开,以便一个函数处理加载,然后在其他地方另一个函数释放它们。除此之外,每个资源可能只是处理自己。我想那是RAII,但我真的不明白如何在D中使用它。

我认为您只是设置了一个新类来承载资源,将其加载到this()并在~this()中释放它但似乎我读到了析构函数不能保证被调用,除非您将该类实例为scope。我可以使用一个结构,但是如果我这样做,我似乎会错过类的有用好处。

我想要的是加载资源并获得有关它们被释放的保证,但是要以理智的方式这样做,不要求我将所有加载和卸载放在一个巨大的方法中。我该怎么做呢?

2 个答案:

答案 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。