关于智能指针的总结

对于普通指针在日常使用的时候会面临一个释放问题,一种可以保证释放不会出错的方式就是谁申请谁释放

但是这种方式实际使用的时候局限性太大,比如说某个函数的功能就是去释放内存,很明显它不能够去释放自己申请的内存

指针释放经常会出现两方面的问题:

1、内存泄漏

2、重复释放

因此引入智能指针,智能指针分为强智能指针和弱智能指针

强智能指针:

智能指针的实现都是对普通指针的一个封装,在封装的时候引入一个引用计数,这个引用计数记录该内存块被引用的次数,在释放内存的时候判断引用计数是否为0,不为0则说明该内存快仍然在被别的指针使用,就不释放内存,而是将引用计数减一,直到引用计数减为0的时候再释放内存

强智能指针的时候存在一个问题:交叉引用

假设类A内部有一个B类型的强智能指针b,同时B类内部有一个A类型的强智能指针a

然后实例化对象aa和bb,此时a对象和b对象所在内存的引用计数为1

再做如下操作:aa.b = bb; bb.a = aa.此时a对象和b对象所在内存的引用计数为2

那么在程序结束时进行内存释放,aa对象和bb对象的引用计数均减一,还是1,此时内存并没有被释放,造成内存泄漏

因此引入弱智能指针:

弱智能指针和强智能指针的实现是差不多的,只是弱智能指针只观测引用计数,并不增加引用计数的大小

因此在使用智能指针的过程中规定只有在定义的时候使用强智能指针,在其他地方均使用弱智能指针

这样就解决了强智能指针带来的交叉引用的问题

### 智能指针的概念 智能指针是 C++11 标准中引入的一种管理动态内存的工具,旨在帮助开发者避免内存泄漏和资源管理问题。与传统的裸指针不同,智能指针通过自动管理内存的生命周期来确保资源在不再需要时能够被正确释放。 C++ 中的智能指针主要有以下三种类型: #### `unique_ptr` `unique_ptr` 是一种独占所有权的智能指针。它不允许拷贝构造或赋值操作,但支持移动语义,这意味着只能有一个 `unique_ptr` 实例指向一个特定的对象。当 `unique_ptr` 被销毁时,它所管理的对象也会被销毁。 **使用方法:** ```cpp std::unique_ptr<int> ptr(new int(10)); ``` 或者更推荐的方式: ```cpp auto ptr = std::make_unique<int>(10); ``` **原理:** `unique_ptr` 保证了单一所有权模型,因此在对象超出作用域时可以安全地释放资源。由于其不可复制特性,使得代码更加安全[^3]。 #### `shared_ptr` `shared_ptr` 是一种共享所有权的智能指针。多个 `shared_ptr` 可以指向同一个对象,并维护一个引用计数器来跟踪有多少个 `shared_ptr` 共享该对象的所有权。只有当最后一个 `shared_ptr` 被销毁时,才会释放该对象占用的资源。 **使用方法:** ```cpp std::shared_ptr<int> ptr1(new int(20)); std::shared_ptr<int> ptr2 = ptr1; // 引用计数增加 ``` 或者更推荐的方式: ```cpp auto ptr = std::make_shared<int>(20); ``` **原理:** `shared_ptr` 使用引用计数机制来管理对象的生命周期。每次创建一个新的 `shared_ptr` 或者将现有的 `shared_ptr` 赋值给另一个时,引用计数会递增;而当某个 `shared_ptr` 被销毁时,引用计数递减。当引用计数变为零时,表示没有 `shared_ptr` 再次引用这个对象,此时对象会被删除[^1]。 #### `weak_ptr` `weak_ptr` 不拥有它所指向的对象,而是对 `shared_ptr` 管理的对象的一个弱引用。它可以用来解决循环引用的问题。`weak_ptr` 必须转换为 `shared_ptr` 才能访问其所关联的对象。 **使用方法:** ```cpp std::shared_ptr<int> sharedPtr(new int(3
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值