C++智能指针及循环引用

本文详细介绍了C++智能指针,包括auto_ptr、unique_ptr、shared_ptr和weak_ptr的原理与特性。重点讨论了shared_ptr在处理循环引用问题时可能导致的内存泄漏,并给出了解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录:

  • auto_ptr
  • unique_ptr
  • shared_ptr
  • weak_ptr
  • 循环引用问题

智能指针的原理:

智能指针的原理:智能指针是一个类,这个类的构造函数中传入一个普通指针,析构函数中释放传入的指针指向的内存。智能指针本身是栈上的对象,所以当函数(程序)结束时会被自动释放掉。
1) auto_ptr:主要是为了解决“有异常抛出时发生内存泄漏”的问题 。因为发生异常而无法正常释放内存。不支持复制和赋值,但复制和赋值时不提示错误,不能放入容器中。

2)unique_ptr:独享指针,不支持复制和赋值,但是赋值会编译出错。提供move方法。

3)shared_ptr:共享指针,基于引用计数的智能指。可以随意地赋值。

对被管理的资源进行引用计数,当一个shared_ptr对象要共享这个资源的时候,该资源的引用计数加1,当这个对象生命期结束的时候,再把该引用计数减少1。这样当最后一个引用它的对象被释放的时候,资源的引用计数减少到0,此时释放该资源。缺点是使用不当,可能存在“环状引用”引起内存泄露

4) weak_ptr:weak_ptr是为了配合shared_ptr而引入的一种智能指针,它指向一个由shared_ptr管理的对象而不影响所指对象的生命周期,也就是将一个weak_ptr绑定到一个shared_ptr不会改变shared_ptr的引用计数。不论是否有weak_ptr指向,一旦最后一个指向对象的shared_ptr被销毁,对象就会被释放。从这个角度看,weak_ptr更像是shared_ptr的一个助手而不是智能指针。

shared_ptr:

C++ 11 模板库的 memory头文件中定义了智能指针,即 shared _ptr 模板;

只要将 new 运算符返回的指针 p 交给一个 shared_ptr 对象“托管”,就不必担心在哪里写delete p语句——实际上根本不需要编写这条语句,托管 p 的 shared_ptr 对象在消亡时会自动执行delete p。而且,该 shared_ptr 对象能像指针 p —样使用,即假设托管 p 的 shared_ptr 对象叫作 ptr,那么 *ptr 就是 p 指向的对象。

通过 shared_ptr 的构造函数,可以让 shared_ptr 对象托管一个 new 运算符返回的指针,写法如下:

shared_ptr ptr(new T); // T 可以是 int、char、类等各种类型

此后,ptr 就可以像 T* 类型的指针一样使用,即 *ptr 就是用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值