C++ 中的弱指针

💡 原文中文,约5300字,阅读约需13分钟。
📝

内容提要

C++的weak_ptr是一个标准库组件,用于存储对由shared_ptr控制的对象的弱引用。它通过转换为shared_ptr来访问对象。weak_ptr不直接访问元素,而是使用shared_ptr对象来调用Lock函数。weak_ptr的主要目的是防止循环引用。通过Lock函数可以获取独占的锁定。weak_ptr还可以与shared_ptr共享所有权。weak_ptr在资源释放后会被擦除。

🔎

延伸解读

weak_ptr 的核心作用:打破循环引用

文章指出 weak_ptr 的主要目的是防止数据结构内出现过长的循环。当两个对象通过 shared_ptr 相互持有对方时,引用计数无法归零,导致内存泄漏。weak_ptr 不增加引用计数,因此可以打破这种循环。但文章也强调,weak_ptr 不能直接访问对象,必须通过 lock() 转换为 shared_ptr 才能使用,这保证了访问时对象仍然存活。

lock() 与 expired() 的配合使用

文章通过示例展示了 lock() 和 expired() 的典型用法:lock() 返回一个 shared_ptr,若对象已被释放则返回空指针;expired() 则直接检查弱引用是否过期。两者都用于判断对象是否仍然有效,但 lock() 会同时获取临时所有权,确保在访问期间对象不被销毁。文章提醒,不应在未转换为 shared_ptr 的情况下直接访问 weak_ptr 指向的对象。

use_count() 与 swap() 的实用技巧

文章示例显示,use_count() 可以跟踪共享对象的 shared_ptr 数量,包括通过 weak_ptr 创建的临时 shared_ptr。swap() 则用于交换两个 weak_ptr 所指向的资源,示例中演示了成员 swap 和标准库 swap 两种方式。这些操作在需要临时切换资源或调整所有权关系时很有用,但文章未深入讨论线程安全性或性能影响。

❓

Q&A

C++ 中 weak_ptr 的主要作用是什么?

weak_ptr 的主要作用是存储对由 shared_ptr 管理的对象的弱引用,防止循环引用,并通过转换为 shared_ptr 来访问对象。

weak_ptr 如何访问它引用的对象?

weak_ptr 不能直接访问对象,必须调用 lock() 成员函数来获取一个 shared_ptr,然后通过该 shared_ptr 访问对象。

weak_ptr 的 expired() 方法有什么用途?

expired() 方法用于检查 weak_ptr 所指向的对象是否已经被释放,如果对象已释放则返回 true,否则返回 false。

weak_ptr 的 use_count() 方法返回什么?

use_count() 返回与 weak_ptr 共享同一对象的 shared_ptr 的数量,用于跟踪对象的引用计数。

如何在两个 weak_ptr 之间交换资源?

可以使用成员函数 swap() 或标准库中的 swap 函数来交换两个 weak_ptr 所管理的资源。

weak_ptr 在资源释放后会发生什么?

当 shared_ptr 释放资源后,weak_ptr 会失去对对象的控制,变为过期状态,此时调用 lock() 将返回空的 shared_ptr。

🏷️

标签

➡️

继续阅读