用于资源管理的C++ shared_ptr与unique_ptr

Rob*_*son 6 c++ smart-pointers resourcemanager shared-ptr unique-ptr

我一直在思索使用unique_ptrVS shared_ptrVS own_solution.我已经贴现后,我几乎肯定会弄错了,但我有一个问题,都unique_ptrshared_ptr中,无论是捕捉恰恰就是我想要的.我想创建一个显式拥有资源的资源管理器,但是我希望资源管理器也能分发对资源的引用.

如果我unique_ptr在资源管理器中使用并分发原始指针,那么他们可能会逃到其他地方(尽管这会违反我认为的类"合同").如果我使用shared_ptr和分发weak_ptr,那么没有什么能阻止调用者将其转换weak_ptr为a shared_ptr并存储它,从而可能创建一个循环或更糟的是,资源生存在资源管理器的生命周期之外.因此,我认为我正在寻找的是一种weak_ptr无法转化为无法实现的shared_ptr.

或者我只是想在代码中使用一些措辞强烈的评论强制执行合同?

感谢您对此可能有的任何想法.

Ded*_*tor 10

最后,你不能强迫任何人听.在微软,苹果或任何开源图书馆开发人员询问时,他们都知道这首歌.正确的词语和地方的评论是你最好的选择.

避免创建自己的智能指针类,它会阻碍组合并降低可读性.作为最后的手段,请尝试查看boost或您的代码已经使用的任何框架.

如果您拥有非所有者,则他们可以选择持有weak_ptrs或(如果保证在此期间保持有效)原始指针.
如果你shared_ptr在内部使用s(为什么你应该),最好提供weak_ptr和原始指针.

所有这些智能指针都明确表示所有权政策.原始指针表示无或非拥有.

  • auto_ptr:不要使用,即使对于警惕也不要使用过多的陷阱.
  • unique_ptr:独家所有权.
  • shared_ptr: 共享所有权
  • weak_ptr:没有所有权,可能会被删除.
  • 原始指针
    • 显然没有所有权,保证更长的寿命
    • 或手动所有权管理.


Mr.*_*C64 6

当你拥有指针时,智能指针就像shared_ptr并且unique_ptr是一个很好的工具. 但对于非拥有指针,即观察指针,使用原始指针就好了.

在你的设计,我觉得资源管理器的资源的唯一的"所有者",所以你可以简单地有某种形式的智能指针的内部资源管理器.例如,资源管理器可以拥有一个std::vector<std::unique_ptr<Resource>>数据成员,std::vector<Resource>如果您的Resource类被设计为可以正确存储,则可以更简单std::vector.

然后,资源管理器可以向外部提供非拥有的观察指针,并且原始指针(或C++引用)适用于这种情况.

当然,资源管理器的生命周期超过"资源客户端"的生命周期非常重要.