指向std :: unique_ptr的内容

Hum*_*awi 16 c++ unique-ptr c++11 raw-pointer

我有一个std::unique_ptr和另一个原始指针.我希望原始指针指向unique_ptr没有任何所有权的内容.它是只读关系:

auto bar=std::make_unique<foo>();
auto ptr=bar.get();// This may point to another value later
Run Code Online (Sandbox Code Playgroud)

这不好吗?还有其他选择吗?

注意:真实的例子比较复杂.他们不在同一个班级.

Rei*_*ica 27

不,它并不坏,直到标准库包含所提出的std::observer_ptr,它是表达非拥有观察者惯用方式.

  • @NicolBolas这是一个问题,他们是否会在`std :: experimental :: observer_ptr`成为`std :: observer_ptr`之后再说.我可以想象该指南变成"读"T*`作为非所有权,但将非所有权写为`std :: observer_ptr <T>`. (5认同)
  • 甚至在那之后,它将是表达这种情况的惯用方式.Core C++指南没有说使用`observer_ptr`; 他们说所有赤裸的"T*"代表非所有权. (3认同)
  • "*这是一个问题,他们是否会在`std :: experimental :: observer_ptr`成为`std :: observer_ptr`之后仍然会说.*"这是一个问题,这是否真的会发生; TS在提议和被采纳到核心标准之间的变化.此外,这不会神奇地转换使用裸指针的未使用指针的现有C++代码的*数十亿行. (2认同)

Xir*_*ema 26

如果你可以保证A) bar的生命周期将超过生命周期ptr,并且B)任何编程器/重构都不会delete ptr;在任何时候写入,那么这是完全正常的,并且可能适用于任何你需要传递指针的情况所有权.

如果无法保证这两个条件,您可能应该使用std::shared_ptrstd::weak_ptr.

  • 你可能不应该使用`shared_ptr`,因为99%的"等待,我可以用`shared_ptr`解决我的资源问题"最终是一个坏主意. (8认同)
  • @Yakk充其量,我会称之为双曲线,最糟糕的是,天真.我在c ++领域遇到了很多问题,其中最好的,最惯用的解决方案是使用`std :: shared_ptr`.我会告诉你,首先依赖指针往往代表设计复杂性的原因(或症状),但如果它们在99%的时间都不好,那么Java(它基本上使用`shared_ptr`类对象对于它的所有指针)将无法用作语言,我们知道情况并非如此. (5认同)
  • 我们真的知道吗?但严重的是,Java使用完整的gc指针,这是与rc指针不同的野兽.将rc指针视为某种真正的gc指针是组件设计中的基本错误的标志,并且这种错误是99%的一部分.我发现共享指针是正确的情况(当你有一些资源的实际*共享所有权*,而不仅仅是"我不想在这里考虑指针问题"),但很少有一个通用的拥有观察到的生命周期问题只需将共享和弱指针铲入系统即可解决. (5认同)