【问题标题】:References to a unique pointer in modern C++ [duplicate]对现代 C++ 中唯一指针的引用 [重复]
【发布时间】:2015-03-14 13:27:01
【问题描述】:

我有一个对象 Window,它有一个成员 std::unique_ptr<Texture>。我使用了一个唯一的指针,因为 Window 真正拥有纹理,并且在 Window 被销毁后使用该纹理没有意义。

Window 有一个方法,Texture& Window::getTexture()。这个想法是有时 Window 外部的代码会说 myWindow.getTexture(),对纹理做一些事情,然后再完成它。

风险在于有人持有纹理引用,该引用在 Window 销毁后变得无效。我可以让 window 持有 std::shared_ptr<Texture>std::weak_ptr<Texture> Window::getTexture(),但是当 Window 是纹理的唯一所有者时,shared_ptr 对我来说感觉不对,而且纹理永远不会超过 Window。

在这种情况下我应该使用什么特定的模式,还是参考方法?在过去,我当然只会返回一个指针。

编辑:我可能想多了,这里是一个正常用法的例子

Texture& tex = myWindow.getTexture();
context.drawHere(tex);
context.drawThere(tex);
context.drawEverywhere(tex);

调用代码必须做一些非常异常的事情来保持引用,通常你只是将它用于几个绘图调用(不保持任何东西)。这是一个非问题,还是我应该使用某种模式在文档之外明确说明这一点?

【问题讨论】:

  • 无论调用 getTexture 都应该拥有纹理,那么这不是问题
  • 也许会返回一个普通的旧指针,并记录当Window 超出范围时它将失效?
  • @juanchopanza:但这是否避免了OP提到的风险? IE。在Window 被销毁后,有人保留了原始指针。当然,他们必须为此忽略文档。但他们也会在引用的情况下这样做,因为引用是关于这个特定所有权问题的一种自我记录,不是吗?
  • Window::updateTexture(std::unique_ptr<Texture> ptr) 然后reset 怎么样?
  • 我认为这个问题无法真正回答,只要我们不知道谁会打电话给getTexture,出于什么目的。

标签: c++ c++11


【解决方案1】:

我喜欢Herb Sutter 和其他人提出的将原始引用或指针放在接口中并使用智能指针进行所有权管理的方法。您只需要确保您的界面的用户理解规则。

【讨论】:

    【解决方案2】:

    也许,你不应该在你的类之外暴露 Texture 并在 Window 中创建特定的方法来对他的纹理执行特定的操作。如果你不能这样做,那么你需要使用一个共享的 ptr,它更安全并且不会对性能产生太大影响。

    希望对你有帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-07-26
      • 1970-01-01
      • 1970-01-01
      • 2017-09-02
      • 2011-02-12
      • 1970-01-01
      • 2011-04-06
      相关资源
      最近更新 更多