【问题标题】:Prevent moving of a unique_ptr C++11防止移动 unique_ptr C++11
【发布时间】:2013-02-24 04:01:41
【问题描述】:

有什么方法可以防止用户使用

显式获取唯一指针的所有权
 std::move

?

【问题讨论】:

  • 也许你可以通过 const 引用来传递它。
  • 你到底想做什么?用户如何访问unique_ptr
  • @DarioOO 如果您不希望用户拥有任何所有权,请返回一个原始指针。
  • @DarioOO:呃,当你返回 unique_ptr 时,根据定义,你给了它唯一的所有权。否则谁拥有它?
  • @DarioOO 如果你不想放弃所有权,如果保证不为空,则通过引用返回;如果它可能为空,则通过原始指针返回(我上面给出的链接是关于明确不拥有其指针对象的“智能”指针的提议,出于文档目的,但它不在标准中)..一旦你返回unique_ptr,你已经放弃了所有权,不管指针是否再次被移动,所以阻止 std::move 对你没有帮助

标签: c++ c++11 move-semantics unique-ptr


【解决方案1】:

设为const

unique_ptr 移动构造函数采用 非 const 右值引用,因此不能使用 const 对象调用。

const unique_ptr<int> owner(new int);
// ...
unique_ptr<int> thief = std::move(owner);  // ERROR

这允许unique_ptrboost::scoped_ptr 一样使用

【讨论】:

  • 很高兴知道这一点,但我怀疑 OP 想要的根本不是给调用者所有权,而不仅仅是为了防止它再次被移走(“我返回一个唯一的指针,我希望用户能够调用该指针的方法而不获取其所有权。")--他可能只需要通过引用返回
  • 啊,我没有看到那个评论 - 是的,只是返回一个参考更有意义
  • 小偷就不能抛弃 const 吗? ;)
  • @FredOverflow 也可以随时调用.get(),不是吗?
  • @FredOverflow,是的,安全从来都不是黑白分明的,这只会阻止随意的、机会主义的小偷,而不是像const_cast :o) 或者我喜欢说的那样,你可以使意外误用接口变得困难,但您的代码永远不会安全地对抗那些坚持破坏它的有充分动机的白痴!
【解决方案2】:

通过返回std::unique_ptr,您已经放弃了对该对象的控制。新的所有者要么将其销毁,要么将其转交给其他人。

如果您不打算让用户释放该对象,则返回一个引用。

您有 boost::scoped_ptr/const std::unique_ptr(参见 Jonathan 的回答),它在技术上回答了您的问题——调用者释放,但不能放弃资源——但我没有看到一个令人信服的例子 em> 为什么你需要这个而不是std::unique_ptr 或参考

【讨论】:

  • 对我来说,问题是允许扩展一个类而没有机会在类外部提供资源。引用不好,因为资源是通过 DI 和负责资源生命周期的类注入的。同时,绑定类和资源的别名构造函数没有意义,因为在类外使用资源是不可能的。上下文是 OpenGL 中的对象缓冲区。
猜你喜欢
  • 2014-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-06
相关资源
最近更新 更多