C++ Observer_ptr

2024 年 8 月 29 日 | 阅读 3 分钟

C++ 智能指针 std::observer_ptr 被纳入 C++ 标准库并在 C++20 中首次亮相。它旨在作为对项目的一种轻量级、非拥有的引用。std::observer_ptr 用于表示代码段观察某个事物,但不承担任何责任或对其存在施加任何控制。它有助于可靠地引用对象而无需管理其内存。

std::observer_ptr 函数的属性

std::observer_ptr 有几个属性。std::observer_ptr 函数的一些主要属性如下:

  • 无所有者:与 std::shared_ptr 或 std::unique_ptr(它们控制所引用对象的生命周期)不同,它不参与其所指向对象的拥有。
  • 不重:它具有极低的内存开销,是一种非常轻量级的指针。与其他智能指针不同,它没有所有权监控或引用计数的开销。
  • 对项目生命周期没有影响:std::observer_ptr 所指向对象的生命周期不会延长。如果它所观察的对象被移除或超出范围,观察者引用仍然有效,即使它可能指向一个潜在的错误内存地址。程序员有责任确保对象的生命周期。

示例

以下是使用 std::observer_ptr 的简单示例:

说明

  • 在此示例中,std::observer_ptr obs_ptr 指向整数 x,但它不影响 x 的生命周期。观察者指针允许您查看对 x 的更改。
  • 当您需要对对象进行非拥有的引用,同时表明没有所有权时,std::observer_ptr 很有用。它可以帮助避免常见的悬空指针和访问已超出范围的事物等问题。

C++ 中 Observer_ptr 的优点

C++ 的 std::observer_ptr 在对对象进行非拥有的、轻量级观察时提供了多项优势。以下是使用 std::observer_ptr 的一些主要优点:

  • 非拥有的语义: std::observer_ptr 明确声明它不是被观察对象的所有者。它促进了非所有权的意图,并有助于防止意外的所有权转移,这对于代码的可读性和可维护性都很有益。
  • 安全性:它有助于避免原始指针的常见问题,包括悬空指针。使用 std::observer_ptr,所有者代码控制对象的生命周期。观察者指针比原始指针更安全,因为它在被观察对象被移除或超出范围时可能指向潜在的错误内存。
  • 轻量级:在内存使用和计算开销方面,std::observer_ptr 是一种高度轻量级的指针。它不包含 std::shared_ptrstd::unique_ptr 等智能指针中额外的所有权跟踪和引用计数信息。
  • 表达力:它使您能够准确地在代码中传达您的意图。当您使用 std::observer_ptr 时,您显然在查看一个项目而不拥有它。它可以提高代码的可读性和自文档化。
  • 兼容性:它旨在与现有接口和代码库良好配合。在使用不支持 C++ 智能指针的历史代码或库时,您可以将 std::observer_ptr 与其他智能指针或原始指针结合使用。
  • 互操作性:在处理 C 库或其他经常使用原始指针的语言时,它会很有帮助。通过使用 std::observer_ptr,在与这些库维护的对象交互时,仍然可以利用 C++ 中的类型安全。
  • 安全性和调试改进:当您尝试访问已超出范围的对象时,通过使用 std::observer_ptr,您可以在构建时发现问题或获得更详细的运行时诊断。

总的来说,std::observer_ptr 是 C++ 的一个有价值的补充,它提高了代码的表达力和安全性,尤其是当您需要表示对对象的非拥有引用时。它鼓励改进实践并有助于避免与所有权管理和原始指针相关的典型错误。