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

标签 c++ class shared-resource

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

我有多个 Renderer 类的实例,它们都使用相同的资源,一个由 SDL 加载的 BMP。这是管理类(class)共享资源的正确方法吗?如果不是,什么是好的?如果有,还有更好的吗?

渲染器.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;
};

渲染器.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;
    }
}

最佳答案

Is this a correct way to manage a shared resource for a class?

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

If not, what is a good one?

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

If yes, are there better ones?

与其在类内部使用静态表面指针和静态引用计数器,不如保留一个shared_ptr。对于那里的表面,在类之外创建它一次,然后将它传递给渲染器构造函数。这样做的一些好处:

(粗体编辑:)

  • 您无需考虑谁是最后的所有者并因此负责资源删除,因为 shared_ptr为你做。
  • 线程安全
  • 更少的代码通常意味着更少的错误。

关于c++ - 类共享资源 - 正确的解决方案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5901355/

相关文章:

Java 局部变量与全局字段 - 性能

C++ 如何初始化 std::istream* 尽管构造函数受到保护

c++ - 关于volatile关键字的问题

c++ - -rdynamic 在静态二进制文件中使用 dlopen 时不起作用

c++ - 参数化模板方法的显式实例化

php - 导入 PHP 命名空间以扩展该命名空间中的类

c++ - C++ 中一般树实现的问题

Python3 Asyncio 在并发任务之间共享资源

c# - PerformanceCounter 创建需要很长时间