1) 避免所有权循环。2) 减少与围绕大量共享指针弹跳相关的开销
通过实现weak_ptr.get(),前者的服务不会少,后者的服务更好,那为什么不存在呢?更重要的是,weak_ptr.get() 不会比weak_ptr.lock().get() 更有效,还是编译器可以优化它以使其相同?
前者是正确的,后者是错误的——弱指针并不是神奇的低成本共享指针……它们在功能上是不同的。你需要选择一个适合你的情况。
使用弱指针的主要原因是跟踪一些您可能想要使用的数据,如果它仍然存在,但可以在没有它的情况下愉快地生存。建立这涉及与共享指针的用户的竞争条件,因此除非您对对象的生命周期有一些内部了解,这意味着您可以确定您的代码可以在对象被销毁之前完成,否则原始指针将毫无用处。如果您确实有内部洞察力,那么您最初可以得到一个原始指针 -而不是弱指针 - 但是弱指针的设计旨在阻止您意外获得一个并创建不安全的代码。事实上,面对代码的中/长期演变,任何这样的洞察力都可能是脆弱的,所以除非绝对必要,否则最好不要尝试进行这样的优化。
也许一个很好地使用弱指针的例子会有所帮助......
假设一个对象代表屏幕上的某些东西——如果你想让它闪烁,你可以将一个弱指针添加到一个计时器驱动的闪光灯列表中,然后你就可以忘记它了。当计时器下一次触发时,如果 Flasher 代码发现该对象事先被销毁(即它不再出现在屏幕上),则 flasher 只会将其从列表中删除,但它不想共享所有权并不自然地保留该对象。这可能比当对象从屏幕上消失而不得不将其从闪光灯列表中删除(并可能阻止等待锁定这样做)时尝试让代码跟踪更容易。