为什么弱指针无法访问底层指针?

Why can't weak pointers access the underlying pointer?

本文关键字:指针 访问 为什么      更新时间:2023-10-16

我问这个问题是因为它是一个削弱力量的限制,有很多明显的原因,但我相信C++标准人员有充分的理由这样做,我想知道它是什么。不是因为它会有任何不同,而是因为它会让我感觉更好,因为知道有充分的原因。

这是我目前对它的看法;在我看来,弱指针有两个主要用途:

1) 以避免所有权循环。2) 以减少与在许多共享指针周围跳跃相关联的开销。

前者的服务不会减少,而后者通过实现weak_ptr.get()得到更好的服务,那么为什么它不存在呢?更重要的是,weak_ptr.get()不是比weak_prt.lock().get(更高效吗?或者编译器可以将其优化为相同吗?

弱指针需要能够检查它引用的智能指针是否仍然有效。如果它不能做到这一点,那么在你实际使用get时,你就不知道它的结果是否有效

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

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

1) 以避免所有权循环。2) 以减少与在许多共享指针周围跳跃相关的开销

前者的服务不会减少,而后者通过实现weak_ptr.get()得到更好的服务,那么为什么它不存在呢?更重要的是,weak_ptr.get()不是比weak_prt.lock().get(更高效吗?或者编译器可以将其优化为相同吗?

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

使用弱指针的主要原因是跟踪一些数据,如果这些数据仍然存在,但没有这些数据可以很好地生存,那么你可能会想使用这些数据。建立这一点涉及到与共享指针用户的竞争条件,因此,除非你对对象的生存期有一些内部了解,这意味着你可以确定你的代码可以在对象被销毁之前完成,否则原始指针将毫无用处。如果你确实有内部见解,那么你可以最初获得一个原始指针-而不是弱指针的-但弱指针的设计旨在防止你意外获得一个指针并创建不安全的代码。事实上,面对代码的中长期演变,任何这样的见解都可能是脆弱的,所以除非绝对必要,否则最好不要尝试进行这样的优化。

也许一个很好地使用弱指针的例子会有所帮助。。。

假设一个物体代表屏幕上的某个东西-如果你想让它闪烁,你可以在计时器驱动的闪光灯列表中添加一个弱指针,然后你就可以忘记它。当计时器下次启动时,如果闪光灯代码发现该物体事先被破坏(即它不再在屏幕上),闪光灯只会将其从列表中删除,但它不想分享所有权,也不想让物体不自然地存在。当对象从屏幕上消失时,这可能比试图跟踪代码更容易,因为必须将其从闪光灯列表中删除(并可能阻止等待锁定)。

这是因为shared_ptr/weak_ptr对的设计者决定最好把我们从自己身上拯救出来,并确保我们不会在知道这无关紧要的情况下以优化为代价错误地使用它。线程安全性和所有权语义可能没有必要是同一回事——很容易就可以生成一个单线程代码块,其中有一个很好的智能指针知道它为空是有益的,但锁定的开销虽然不会削弱,但绝对是一种令人讨厌的做法。

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

我们在代码库中通过添加一种支持这些语义的新型智能指针来解决这个问题。然而,这肯定不是最佳的,因为拥有不符合标准的智能指针肯定很烦人,但额外有用的语义远远弥补了我们可能不如完整的标准化委员会那么聪明的事实:-)