弱点指针为什么不能访问底层指针?

问题描述:

我问这是因为这是一个显而易见的原因使人虚弱的限制,但我确信C++标准的人有一个很好的理由去做,我想知道它是什么。不是因为它会有所作为,而是因为它会让我感觉更好,因为知道它有一个很好的理由。弱点指针为什么不能访问底层指针?

这是我目前的看法;我看到它微弱的指针有两个主要用途:

1)避免所有权循环。 2)减少与大量共享指针跳动有关的开销。

前者将不低于供应,通过实施weak_ptr.get(),后者提供更好的服务,所以为什么不存在?更重要的是,不会weak_ptr.get()比weak_ptr.lock()。get()更有效率,或者编译器可以优化它是否相同?

+2

在boost文档中,有一个解释,为什么'weak_ptr'不会使用像get()这样的方法返回原始指针:[Boost 1.43.0:weak_ptr](http://www.boost.org /doc/libs/1_43_0/libs/smart_ptr/weak_ptr.htm)。 – Pixelchemist

+0

会阅读。谢谢。 – arman

弱指针需要能够检查它引用的智能指针是否仍然有效。如果它不能这样做,那么您无法知道get的结果在您实际使用它的时候是否有效。

这就是为什么有lock;它会给你一个智能指针,只要你需要它就会有效(这不会很长)。

如果你想直接访问,那么你真正想要的是一个普通的“哑”指针。

1)避免所有权循环。 2)减少与大量共享指针跳动相关的开销

前者不会受到影响,后者通过实现weak_ptr.get()更好地服务,那为什么它不存在?更重要的是,不会weak_ptr.get()比weak_ptr.lock()。get()更有效率,或者编译器可以优化它是否相同?

以前是真的,后者是错的 - 弱指针不是神奇的低成本共享指针......它们在功能上是不同的。你需要选择一个适合你的情况。

的主要原因使用弱指针是跟踪,你可能想使用它是否还在闲逛的一些数据,但可以在不愉快地生存。建立与共享指针的用户相关的竞争条件,所以除非你有一些内部人员洞察对象的生命周期,这意味着你可以确定你的代码可以在对象被销毁之前完成,否则原始指针将毫无用处。如果你有内幕的洞察力,那么你可以得到最初原始指针 - 弱指针,而不是 - 但弱指针的设计是为了阻止你不小心让一个和创建不安全的代码。事实上,任何这样的见解在代码的中/长期演变面前都可能是脆弱的,所以最好不要试图做出这样的优化,除非你绝对必须。

或许用好弱指针会帮助的例子...

说,一个对象表示在屏幕上的东西 - 如果你想让它闪烁你一个弱指针添加到一个定时器驱动闪光列表那么你可以忘记它。当计时器下一次触发时,如果闪光器代码发现事先销毁的对象(即不再显示在屏幕上),则闪光器将从列表中删除它,但它不想共享所有权并使对象不自然地保持周围。这可能比试图在屏幕上不得不从闪烁列表中删除对象时(并且可能会阻止等待锁定)来执行代码跟踪更容易。

+0

这解释了使用'weak_ptr'的原因,但不解释为什么它没有'get'。 –

+0

@ChristianRau:任何人谁明白'GET'得到一个原始指针,它确实解决(最长的上段)。 –

这是因为shared_ptr的/ weak_ptr的对的设计者认为最好把我们从自己保存,并确保我们不能使用它不当在最佳化的代价,当我们知道这并不重要。它可能没有必要有线程安全和所有权的语义是相同的东西 - 它很容易拿出其中具有知道它的空是有益的,但锁定的开销是一个很好的智能指针代码单线程块,而不是虚弱,绝对是一个悲观。

是否shared_ptr/weak_ptr应该允许这个(添加notad_ptr,其中notad - null表示目标销毁,但不一定是线程安全的),或者这应该是一个新类型的shared_ptr是有争议的。

我们通过添加支持这些语义的新型智能指针来解决这个问题。但是,这绝对不是最佳的,因为其不符合标准的智能指针肯定是烦人,但其他有用的语义超过弥补我们可能不聪明的事实,作为完全standardisations委员会是[双关语意!]: - )