C++ Weak Pointer

2024 年 8 月 28 日 | 阅读 6 分钟

在本文中,我们将讨论 C++ 中的弱指针,包括它们的语法和示例。

C++ 中的weak_ptr是一个标准库组件。它用于存储对 shared_ptr 标准库指针所控制的任何对象的弱引用,该指针最终用于将 weak_ptr 转换为 shared_ptr。从 weak_ptr 最终创建的 shared_ptr 用于访问被引用的对象。一个 shared_ptr 在从 weak_ptr 创建后,如果这个 weak_ptr 已经不再被任何 shared_ptr 所控制,那么它将失去永久存在的意义,这表明它只存在短暂的时间。因此,在访问 weak_ptr 指向的对象之前,不建议直接访问,而是应先将其转换为 shared_ptr

语法

它具有以下语法:

根据 C++ weak_ptr 函数的语法,Class T 作为参数提供,用于表示 weak pointer 所控制的类型。

C++ 的 weak_ptr 是如何工作的?

在高级语言中,每个指针主要用于引用对象,然后以结构化的方式访问数组中可用的元素。C++ 的weak_ptr也遵循类似的模式。weak_ptr 的工作流程在类模板中进行了描述。

  • 用于引用对象的 weak_ptr 最初并不是实际的指针,因为它在对象引用和赋值方面被视为临时指针。
  • 然而,一旦 weak_ptr 获得了对 share_ptr 的最终控制权或权威,对象访问和引用就变得简单而高效。
  • 这种协调共享,以及在 weak_ptrshare_ptr 之间切换进行读取和引用,其主要目的是防止数据结构中出现过长的循环。
  • share_ptr 在资源分配和分析期间承担管理资源的全部责任时,weak_ptr 将失去所有控制并被销毁。
  • weak_ptr 从不允许直接访问元素;相反,它使用拥有全部代码的 shared_ptr 对象,调用成员函数 Lock 来访问需要使用该资源的代码。
  • 一旦调用 Lockweak_ptr 来进行资源分配或控制任何锁(bLock),就会生成一个空的 weak_ptr 对象
  • 一旦 Lockweak_ptr 被大多数 shared_ptr 对象联合引用或持有,就完成了一个完整的周期。
  • 它不是仅仅使用 weak_ptr(它是任何指针概念中指针完整工作格式的一部分),而是借助 share_ptr 来显著地利用所有资源
  • shared_ptr 利用 weak_ptr 的获取 Locks 的行为以及 weak_ptr 的指向,使得最终资源被 weak_ptr 释放和解除分配。
  • 一旦上述所有资源都已释放,列表及其相关节点也将很容易被删除和区分,从而创建一种优化的分析和格式调整方法。
  • 这个完整的周期包含许多检查和方法,包括 expired() 方法,该方法用于确定所有权是否已过期。
  • 通过使用 Lock(),您可以对资源进行单独的、排他的锁定,防止其他资源尝试指向它并因此发生冲突。
  • 通过 owner () 检查 weak_ptr 的指向,如果它指向正确,则返回 true。
  • 在整个周期内,使用 Reset() 来释放所拥有的资源。
  • 当两个 weak_ptr 操作对象时,会使用 swap() 技术
  • use_count() 用于计算和跟踪 shared_ptr 对象的数量。
  • 用于交换初始拥有资源的技术是 operator=

C++ 中的 weak_ptr 示例

以下是 C++ 中 weak_ptr 的一些示例

示例 - 1

输出

Weak pointer value: 42
Weak pointer is expired after reset

说明

在此示例中,共享指针 shared_Ptr 指向值为 42int。之后,创建了一个 sharedPtr 和一个 std::weak_ptrweakPtr。如果原始对象已被删除,Lock() 函数将返回一个空的共享指针,该指针用于从弱指针检索共享指针。

该程序首先打印共享对象的值,当它使用弱指针访问它时。之后,共享指针被重置,模拟了初始共享指针不再控制该对象的情况。重置共享指针后,程序会尝试再次使用弱指针访问该对象。

示例 - 2

输出

Acquired weak_ptr through Lock(): 14
Weak pointer expired: false
Weak pointer expired after reset: true

示例 - 3

输出

Count of sharedPtr1: 1
Count of weakPtr: 1
Count of sharedPtr1 after sharedPtr2 creation: 2
Count of weakPtr after sharedPtr2 creation: 2

示例 - 4

输出

*shrd_ptr_1 == 8
*shrd_ptr_1 == 10
*shrd_ptr_1 == 8

*wk_ptr_1 == 8
*wk_ptr_2 == 10
*wk_ptr_1 == 8

说明

此程序演示了如何利用 swap() 方法在需要获取所需资源时交换 weak_ptr,如输出所示。

在提供的程序的开头,创建了指向整数 810shared_ptr 实例 shrd_ptr_1shrd_ptr_2。之后,打印 shrd_ptr_1 的值(为8)。接下来,它使用成员函数 swap 和标准库中的 swap 函数来交换 shrd_ptr_1shrd_ptr_2 的内容。因此,shrd_ptr_1 的值从8 变为10,然后再变回。作为 shared_ptr 实例的一部分,程序创建了两个 weak_ptr 实例,wk_ptr_1wk_ptr_2t 打印 wk_ptr_1 的值 8。之后,使用成员函数 swap 和标准库中的 swap 函数交换 wk_ptr_1wk_ptr_2 的所有权。交换 wk_ptr_1wk_ptr_2 的值后,wk_ptr_1 现在包含数字10。程序最后再次交换 wk_ptr_1wk_ptr_2 以恢复到之前的所有权。之后,打印 wk_ptr_1 的值,返回8

结论

C++ weak_ptr 函数对于获取和访问列表节点元素至关重要。此外,shared_ptrweak_ptr 协同工作,创建了一个优化的周期来访问元素。一旦选择了 shared_ptr,它通常被认为是永久操作。C++ weak_ptr 函数为资源获取提供了许多优势。