C++ 面试题 目录

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

推荐答案

weak_ptr 是 C++ 标准库中的一种智能指针,用于解决 shared_ptr 的循环引用问题。它不会增加引用计数,也不会管理对象的生命周期,而是通过观察 shared_ptr 所管理的对象来避免悬空指针的问题。

本题详细解读

weak_ptr 的作用

  1. 解决循环引用问题shared_ptr 的引用计数机制在对象之间存在循环引用时会导致内存泄漏。weak_ptr 不会增加引用计数,因此可以打破这种循环引用。

  2. 观察 shared_ptr 管理的对象weak_ptr 可以观察 shared_ptr 所管理的对象,但不会影响该对象的生命周期。当 shared_ptr 释放对象时,weak_ptr 会自动失效。

  3. 避免悬空指针weak_ptr 可以通过 lock() 方法获取一个 shared_ptr,从而安全地访问对象。如果对象已经被释放,lock() 会返回一个空的 shared_ptr,避免了悬空指针的问题。

使用示例

-- -------------------- ---- -------
-------- ----------
-------- --------

----- -- -- ----

----- - -
-------
    ------------------ ------
    ---- - --------- -- -- ---------- -- ---------- -
--

----- - -
-------
    ---------------- ------ -- -- -------- ------
    ---- - --------- -- -- ---------- -- ---------- -
--

--- ------ -
    ------------------ - - ----------------------
    ------------------ - - ----------------------

    -------- - --
    -------- - --

    -- -- - - - ------- ----------
    ------ --
-

关键方法

  • lock():返回一个 shared_ptr,如果对象仍然存在,则返回有效的 shared_ptr,否则返回空的 shared_ptr
  • expired():检查 weak_ptr 是否已经失效(即对象是否已被释放)。

适用场景

  • 当需要观察一个对象但不希望影响其生命周期时。
  • 当对象之间存在循环引用时,使用 weak_ptr 可以避免内存泄漏。

注意事项

  • weak_ptr 不能直接访问对象,必须通过 lock() 方法获取 shared_ptr 后才能访问。
  • weak_ptr 本身不管理对象的生命周期,因此不会增加引用计数。
纠错
反馈