小工具知识网

当前位置: 首页 > 行业知识 > 【C++入门到精通】智能指针 shared

行业知识

【C++入门到精通】智能指针 shared

2026-10-21 07:01:52 来源:互联网转载

阅读导航

  • 引言
  • 一、std::shared_ptr的循环引用
    • 1. 概念
    • 2. 示例分析
    • 二、std::weak_ptr
      • 1. 简介
      • 2. weak_ptr模板类提供的成员方法
      • 3. 使用示例
        • (1)weak_ptr指针的创建
        • (2)完整示例(解决上面循环引用问题)
        • 4. C++模拟实现
        • ���馨提示

          引言

          欢迎阅读本系列文章的第二篇,我们将继续探讨与 shared_ptr 相关的主题。上一篇文章我们介绍了 shared_ptr 的强大功能,但也提到了它可能面临的一个问题 —— 循环引用。当两个或多个对象之间相互持有 shared_ptr 的引用时,就会形成循环引用,导致这些对象无法被正确释放,从而引发内存泄漏。

          在本文中,我们将深入讨论循环引用问题,并引入另一个智能指针类——weak_ptr。weak_ptr 是 shared_ptr 的伙伴,它可以帮助我们解决循环引用问题,并且不会增加引用计数,以避免对象无法释放的情况。

          通过学习 shared_ptr 和 weak_ptr 的组合使用,我们将能够更好地管理动态分配的对象,避免内存泄漏,并提高代码的健壮性和可维护性。敬请期待本文的剖析和示例,希望能给您带来更深入的了解和实践经验。

          一、std::shared_ptr的循环引用

          1. 概念

          当使用 std::shared_ptr 时,循环引用是一种常见的问题。循环引用指的是两个或多个对象彼此持有 shared_ptr 的引用,形成一个环状依赖关系。这种情况下,即使没有外部引用指向这些对象,它们的引用计数也无法降为零,从而导致内存泄漏。

          循环引用可能会导致内存泄漏的发生,因为每个对象都会持有对其他对象的引用,导致它们的引用计数无法归零。当没有外部引用指向这些对象时,它们的析构函数不会被调用,从而导致资源无法正确释放。

          2. 示例分析

          首先我们来看一段代码,这段代码就明显存在着循环引用。

          struct ListNode{int _data;shared_ptr _prev;shared_ptr _next;~ListNode(){ cout shared_ptrint _data;weak_ptr cout shared_ptrpublic:    // 默认构造函数,将_ptr成员指针初始化为nullptr    weak_ptr()        :_ptr(nullptr)    {}    // 接受shared_ptr参数的构造函数,将_ptr成员指针初始化为shared_ptr所管理对象的指针    weak_ptr(const shared_ptr}    // 重载*运算符,返回所管理对象的引用    T& operator*()    {        return *_ptr;    }    // 重载-运算符,返回所管理对象的指针    T* operator-()    {        return _ptr;    }    // 返回所管理对象的指针    T* get()    {        return _ptr;    }private:    T* _ptr; // 所管理对象的指针};

上一篇:宁夏机房升级在哪里?

下一篇:服务器不好的英文怎么写?