指向 std::unique_ptr 的内容
Posted
技术标签:
【中文标题】指向 std::unique_ptr 的内容【英文标题】:Pointing to the content of std::unique_ptr 【发布时间】:2016-08-11 16:35:54 【问题描述】:我有一个std::unique_ptr
和另一个原始指针。我希望原始指针指向 unique_ptr
的内容,而没有任何所有权。是只读关系:
auto bar=std::make_unique<foo>();
auto ptr=bar.get();// This may point to another value later
这很糟糕吗?有没有其他选择?
注意:真实的例子更复杂。他们不在同一个班级。
【问题讨论】:
不应该是bar.get();
吗?
@πάνταῥεῖ 是的对不起
我会说这是理想的。但我可能会选择一个不同的名称,因为已经有一个 std::weak_ptr
具有不同的语义。
有什么理由使用指针而不是引用?
@DanielJour 稍后可能会指向另一件事。参考文献不能重指
【参考方案1】:
不,还不错,在标准库合并proposed std::observer_ptr
之前,它是表达非拥有观察者的惯用方式。
【讨论】:
即使在那之后,这也将是表示它的惯用方式。 Core C++ 指南没有说要使用observer_ptr
;他们说所有赤裸的T*
s 都代表没有所有权。
@NicolBolas 在std::experimental::observer_ptr
变成std::observer_ptr
之后,他们是否还会说是个问题。我可以想象该指南变成“将T*
读为非所有权,但将非所有权写为std::observer_ptr<T>
。”
"在std::experimental::observer_ptr
变成std::observer_ptr
之后,他们是否还会这么说是个问题。" 这个问题是否真的会发生; TS 在被提议和被采纳到核心标准之间的转变。此外,这不会神奇地改变现有 C++ 代码的 十亿 行,这些代码使用裸指针作为无主指针。
@NicolBolas: 就像shared_ptr
和unique_ptr
没有转换数十亿行(嗯,那是不久前,可能只是数亿行)使用裸指针的C++ 代码为所有权。自然,在阅读代码时,您必须考虑它的年龄,或者它所采用的项目的年龄。
@SteveJessop:不同之处在于:使用智能指针可以真正提高代码的正确性。它使使用指针更加安全,等等。使用observer_ptr
纯粹是符号;它不能使您的代码更正确。此外,与拥有裸指针相比,代码中的观察指针要多得多。这就是为什么协鑫的owner<T>
是一个更好的选择;它可能是符号,但你只把它放在已知有问题的指针上。【参考方案2】:
如果你能保证 A) bar
的生命周期将超过 ptr
的生命周期,并且 B) 任何程序员/重构都不会写delete ptr;
在任何时候,这都很好,并且可能非常适合需要传递没有所有权的指针的任何情况。
如果不能保证这两个条件,您可能应该使用std::shared_ptr
和std::weak_ptr
。
【讨论】:
你可能不应该使用shared_ptr
,因为99% 的“等等,我可以用shared_ptr
解决我的资源问题”最终都是个坏主意。
@Yakk 充其量我会称之为双曲线,最坏的情况是幼稚。我在 c++ 领域遇到了许多问题,其中最好、最惯用的解决方案调用了std::shared_ptr
的使用。我承认,首先对指针的依赖往往代表了设计复杂性的原因(或症状),但如果它们“99% 的时间”都不好,Java(它基本上使用shared_ptr
-like 对象对于它的所有指针)将无法用作一种语言,我们知道情况并非如此。
我们真的知道吗?但说真的,Java 使用完整的 gc 指针,这与 rc 指针是不同的野兽。将 rc 指针视为某种真正的 gc 指针是组件设计中基本错误的标志,而此类错误是 99% 的一部分。我发现共享指针是正确的情况(当您拥有某些资源的实际共享所有权,而不仅仅是“我不想在这里考虑危险的指针问题”),但很少有通用的只需将共享指针和弱指针铲入系统即可解决拥有观察生命周期问题。
@Yakk 这就是我的条件的 [暗示] 点:如果你不满足这些条件,你可能没有使用一个被正确设计为“观察者观察”的系统"范式。以上是关于指向 std::unique_ptr 的内容的主要内容,如果未能解决你的问题,请参考以下文章