【问题标题】:Class shared resource - correct solution?类共享资源 - 正确的解决方案?
【发布时间】:2011-05-05 16:48:28
【问题描述】:

这不是作业,只是关于我的代码的问题(我正在学习 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;
    }
}

【问题讨论】:

    标签: c++ class shared-resource


    【解决方案1】:

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

    是的,严格来说这是一个正确的方法。但它是你应该尽快离开的。不,不要走——跑。并且不要回头。

    如果不是,什么是好的?

    喜欢任何类似于std::shared_ptr<>boost::shared_ptr<> 的东西。

    如果有,还有更好的吗?

    不要在类内部拥有一个静态表面指针和一个静态引用计数器,只需为表面保留一个shared_ptr,在类外部创建一次,然后将其传递给渲染器构造函数。这样做的一些好处:

    以粗体编辑:

    • 您无需考虑谁是最后一个所有者并因此负责资源删除,因为shared_ptr会为您完成这些工作。
    • 线程安全
    • 更少的代码通常意味着更少的错误。

    【讨论】:

    • 建议人们“不要思考”对象的生命周期是不好的,恕我直言 - shared_ptr 并不是所有问题的答案。
    • @unapersson:叹息。我想我过早地简化了这句话。查看我的编辑。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多