对现代C++中唯一指针的引用

References to a unique pointer in modern C++

本文关键字:指针 引用 唯一 C++      更新时间:2023-10-16

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

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

风险是有人持有纹理引用,该引用在窗口销毁后变得无效。 相反,我可以让窗口保持std::shared_ptr<Texture>std::weak_ptr<Texture> Window::getTexture()但是当窗口是纹理的唯一所有者时,shared_ptr感觉不对,而且纹理永远不会比窗得更久。

在这种情况下,

我应该使用特定的模式吗,还是引用是要走的路? 在过去,我当然只会返回一个指针。

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

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

代码必须执行一些非常异常的操作才能保留引用,通常您只需将其用于几次绘制调用(不保留任何内容)。 这是不是问题,还是我应该使用某种模式来在文档之外明确这一点?

我喜欢

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

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

希望对您有所帮助。