行业知识
【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; // 所管理对象的指针};
上一篇:宁夏机房升级在哪里?
下一篇:服务器不好的英文怎么写?