Kai*_*aan 4 c++ smart-pointers unique-ptr c++11
我有一个unique_ptrs向量,它指向模型,网格等,如下所示:
std::vector<std::unique_ptr<Model>> mLoadedModels;
Run Code Online (Sandbox Code Playgroud)
我选择unique_ptr因为它会自动释放向量析构函数上的数据,并且因为如果我需要重新加载所有模型(由于OpenGL上下文拆除/创建),我可以在内部的资源管理器reset()和使它指向一个新的Model实例,它不会影响系统的其余部分.
我的问题是,你如何与其他系统共享矢量的内容?你不能只传递unique_ptr,因为这会改变所有权(由于其unique_ptr),我想在rersource管理器中拥有唯一的所有权.
我想出的解决方案如下,将访问包装在以下结构中:
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
Run Code Online (Sandbox Code Playgroud)
虽然这有点噱头,但这肯定是一个更好,更直接的解决方案吗?
Yak*_*ont 10
有一个简单的解决方案.
传球vec[n].get()- 原始指针.只要你不存储它们,并且总是从主人那里取回它们,并且所有者在你使用它们时不会销毁它们,那么你就是安全的.
如果你是不是愿意遵循纪律的这个水平,你需要的是一个std::shared_ptr在vector,并通过周围和存储std::weak_ptr秒.该weak_ptr的意志为自动无效时,最后shared_ptr消失(和政策,唯一的执着shared_ptr是一个在所属vector).
这具有额外的优点,如果您正在处理元素并vector清除自身,则不会出现段错误.您访问一个返回a 的weak_ptrby .lock(),shared_ptr在其生命周期内,原始指针保证良好.
缺点是这会增加成本,其好处在于它允许弱共享所有权和懒惰的无效通知.
| 归档时间: |
|
| 查看次数: |
815 次 |
| 最近记录: |