C++ 面试题 目录

C++ 中 shared_ptr 的特点和用法

推荐答案

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

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

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

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

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

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

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

本题详细解读

1. shared_ptr 的特点

std::shared_ptr 是 C++ 标准库中的一种智能指针,用于管理动态分配的对象。它的主要特点包括:

  • 共享所有权:多个 shared_ptr 可以共享同一个对象的所有权。当最后一个 shared_ptr 被销毁或重置时,对象才会被自动删除。
  • 引用计数shared_ptr 使用引用计数来跟踪有多少个 shared_ptr 共享同一个对象。每次复制或赋值 shared_ptr 时,引用计数会增加;每次 shared_ptr 被销毁或重置时,引用计数会减少。
  • 自动内存管理:当引用计数降为零时,shared_ptr 会自动删除所管理的对象,从而避免内存泄漏。

2. shared_ptr 的用法

  • 创建 shared_ptr:可以使用 std::make_shared 函数来创建 shared_ptr,这是推荐的方式,因为它更高效且更安全。

  • 共享所有权:可以通过赋值操作将 shared_ptr 共享给其他 shared_ptr

  • 访问对象:可以使用 ->* 操作符来访问 shared_ptr 所管理的对象。

  • 获取引用计数:可以使用 use_count() 方法获取当前 shared_ptr 的引用计数。

  • 重置 shared_ptr:可以使用 reset() 方法来重置 shared_ptr,使其不再管理当前对象。

3. 注意事项

  • 循环引用:如果两个或多个 shared_ptr 相互引用,可能会导致循环引用问题,从而导致内存泄漏。这种情况下,可以考虑使用 std::weak_ptr 来打破循环引用。

  • 性能开销:由于 shared_ptr 需要维护引用计数,因此它比裸指针和 std::unique_ptr 有更高的性能开销。

  • 线程安全shared_ptr 的引用计数操作是线程安全的,但访问所管理的对象本身并不保证线程安全。

纠错
反馈