类共享资源 - 正确的解决方案?

时间:2011-05-05 16:48:28

标签: c++ class shared-resource

这不是家庭作业,只是关于我的代码的问题(我正在学习C ++)。

我有多个类Renderer的实例都使用相同的资源,即SDL加载的BMP。这是管理类的共享资源的正确方法吗?如果没有,那么什么是好的?如果是的话,还有更好的吗?

renderer.hpp

class Renderer {
    public:
        Renderer(SDL_Surface *target_surface, int w, int h);
        Renderer(const Renderer& renderer);
        ~Renderer();
        // ...
    private:
        int w, h;
        SDL_Surface *target;

        static SDL_Surface *blocks;
        static int numinstances;
};

renderer.cpp

const char BLOCKS_FILE[] = "blocks.bmp";
SDL_Surface *Renderer::blocks = 0;
int Renderer::numinstances = 0;

Renderer::Renderer(SDL_Surface *target, int w, int h) {
    numinstances++;

    if (blocks == 0) {
        // temporary storage for file
        SDL_Surface *loadedimg = SDL_LoadBMP(BLOCKS_FILE);
        if (loadedimg != NULL) {
            blocks = SDL_DisplayFormat(loadedimg);
            SDL_FreeSurface(loadedimg);
        }

    }

    this->target = target;
    this->w = w;
    this->h = h;
}

Renderer::Renderer(const Renderer& renderer) {
    numinstances++;

    w = renderer.w;
    h = renderer.h;
    target = renderer.target;

}

Renderer::~Renderer() {
    numinstances--;

    if (numinstances == 0) {
        SDL_FreeSurface(blocks);
        blocks = 0;
    }
}

1 个答案:

答案 0 :(得分:2)

  

这是管理类的共享资源的正确方法吗?

是的,严格来说,这是 正确的方法。但是你应该尽可能快地离开它。不,不要走路 - 跑步。不要回头。

  

如果没有,那么什么是好的?

首选类似std::shared_ptr<>boost::shared_ptr<>的内容。

  

如果是,有更好的吗?

不要在类中使用静态表面指针和静态引用计数器,只需在表面保留一个shared_ptr,在类外创建一次然后传递它到渲染器构造函数。这样做的一些好处:

以粗体编辑:

  • 您无需考虑关于谁是最后一位所有者,从而负责资源删除,因为 shared_ptr会为您做到这一点。
  • 线程安全
  • 较少的代码通常意味着更少的错误。