c++ - 处理容器中的 unique_ptr

标签 c++ c++11 smart-pointers unique-ptr

我有一个指向模型、网格等的 unique_ptr vector ,如下所示:

std::vector<std::unique_ptr<Model>> mLoadedModels;

我选择 unique_ptr 是因为它会在 vector 析构函数时自动释放数据,还因为稍后如果我需要重新加载所有模型(由于 OpenGL 上下文拆除/创建)我可以在我的资源管理器内部重置() 并使其指向一个新的模型实例,它不会影响系统的其余部分。

但我的问题是,您将如何与其他系统共享 vector 的内容?您不能只传递 unique_ptr,因为那会改变所有权(由于它的 unique_ptr),我希望在资源管理器中拥有唯一所有权。

我想出的解决方案如下,将访问包装在以下结构中:

template<typename T>
struct Handle
{
    Handle(std::unique_ptr<T>& resource) : mResource(resource)
    {
    }

    T& operator*()                  { return mResource.get(); }
    const T& operator*() const      { return mResource.get(); }
    T* operator->()                 { return mResource.get(); }
    const T* operator->() const     { return mResource.get(); }


private:
    std::unique_ptr<T>& mResource;
};

typedef Handle<Model> ModelPtr;

ModelPtr GetModel(const std::string& modelName);

// example:
ModelPtr monkey = GetModel("Monkey");
monkey->dance();

// reload resources, and then monkey dereferences to the new Model instance 

虽然感觉有点花哨,但肯定有更好、更直接的解决方案吗?

最佳答案

有一个简单的解决方案。

传递 vec[n].get() -- 原始指针。只要您不存储它们,并始终从所有者那里取回它们,并且所有者在您使用它们时不破坏它们,您就是安全的。

如果您不愿意遵循这种级别的纪律,您需要的是 vector 中的 std::shared_ptr,并传递和存储 std::weak_ptrs。 weak_ptr 将在最后一个 shared_ptr 消失时自动失效(根据政策,唯一持久的 shared_ptr 是拥有 vector )。

这有一个额外的好处,如果您正在对一个元素进行操作并且 vector 自行清除,您就不会出现段错误。您通过 .lock() 访问一个 weak_ptr,它返回一个 shared_ptr,在其生命周期内保证原始指针是好的。

缺点是这会增加成本,优点是它允许弱共享所有权和懒惰的失效通知。

关于c++ - 处理容器中的 unique_ptr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17753442/

相关文章:

c++ - 使用 C++ 进行 iPhone Quartz 2d 开发?

c++ - 在一行中初始化/设置 char *argv[] inside main()

c++ - 为什么 C++ 不允许在一个 auto 语句中使用多种类型?

c++ - 动态调度方法

C++ 为什么 'note: see reference to class template instantiation being compiled'

rust - 在 Option<Rc<Struct>> 上调用 map 与在 Option<Rc<i32>> 上调用 map 的工作方式不同

c++ - 将 unique_ptr 作为引用参数或 const unique_ptr 引用传递

c++ - 如何在必须复制构造的类中使用 std::auto_ptr?

c++ - OpenGL 纹理在 3.3 中全是黑色 - 但在 3.1 中有效

C++:array.size() 是循环的良好条件吗?