C++——智能指针

前言:哈喽小伙伴们,今天我们继续来分享C++的一个全新知识------智能指针。


目录

一.何为智能指针

RAII

二.智能指针的种类

三.内存泄漏

结语


一.何为智能指针

RAII

RAII(Resource Acquisition Is Initialization)是一种利用对象生命周期来控制程序资源(如内存、文件句柄、网络连接、互斥量等等)的简单技术。
在对象构造时获取资源,接着控制对资源的访问使之在对象的生命周期内始终保持有效,最后在对象析构的时候释放资源。借此,我们实际上把管理一份资源的责任托管给了一个对象。这种做法有两大好处:

  • 不需要显式地释放资源。
  • 采用这种方式,对象所需的资源在其生命期内始终保持有效。

借由RAII的思想,我们引出智能指针

cpp 复制代码
template<class T>
class SmartPtr {
public:
    SmartPtr(T* ptr = nullptr)
       : _ptr(ptr)
   {}
    ~SmartPtr()
   {
        if(_ptr)
            delete _ptr;
   }
private:
    T* _ptr;
};
void Func()
{
    SmartPtr<int> sp1(new int);
    SmartPtr<int> sp2(new int);
    cout << div() << endl;
}

所谓智能指针,就是通过一个类来控制指针对象的存亡,通过这种方式创建的对象,只要函数退出,就会自动执行其析构函数


二.智能指针的种类

上述我们所实现的,只是智能指针的基础部分,那么在C++的库中,是包含很多种智能指针的:

  • auto_ptr
  • unique_ptr
  • shared_ptr

这三种智能指针,在智能指针之间的拷贝赋值中有所区别

auto_ptr指针如果进行拷贝,是通过转移管理权的思想,也可以理解为移动构造,直接争夺资源,但是并不会造成原指针的销毁,而是置空。
unique_ptr指针简单粗暴,直接就是禁止进行拷贝。

能够看出,上述两种智能指针,都不允许指针之间进行数据共享 ,而shared_ptr却可以:

shared_ptr的原理:是通过引用计数的方式来实现多个shared_ptr对象之间共享资源。

其具体实现方式为:

  1. shared_ptr在其内部,给每个资源都维护了着一份计数,用来记录该份资源被几个对象共享。
  2. 在对象被销毁时(也就是析构函数调用),就说明自己不使用该资源了,对象的引用计数减一。
  3. 如果引用计数是0,就说明自己是最后一个使用该资源的对象,必须释放该资源;
  4. 如果不是0,就说明除了自己还有其他对象在使用该份资源,不能释放该资源,否则其他对象就成野指针了。

再日常使用中,shared_ptr是最常用也是最推荐的智能指针。


三.内存泄漏

那么我们设计智能指针的目的,就是为了防止发生内存泄漏

什么是内存泄漏: 内存泄漏指因为疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并不是指内存在物理上的消失,而是应用程序分配某段内存后,因为设计错误,失去了对该段内存的控制,因而造成了内存的浪费。
**内存泄漏的危害:**长期运行的程序出现内存泄漏,影响很大,如操作系统、后台服务等等,出现内存泄漏会导致响应越来越慢,最终卡死。


结语

关于智能指针就分享这么多,喜欢本篇文章记得一键三连,我们下期再见!

相关推荐
单片机学习之路36 分钟前
【Python】输入input函数
开发语言·python
cch89181 小时前
ThinkPHP6.x全面升级:性能与功能双飞跃
开发语言·vue.js·后端·golang
yangyanping201081 小时前
Go语言学习之Go Gin 生产级 flag 启动命令模板
开发语言·学习·golang
xyq20241 小时前
R语言处理JSON文件的方法详解
开发语言
默 语1 小时前
OpenClaw“养龙虾“热潮降温的深层解析:从技术狂欢到理性回归
android·开发语言·kotlin
平安的平安1 小时前
Python 构建AI多智能体系统:让三个 AI 协作完成复杂任务
开发语言·人工智能·python
Fcy6481 小时前
算法基础详解(4)双指针算法
开发语言·算法·双指针
golang学习记1 小时前
VS Code官宣:全面支持Rust!
开发语言·vscode·后端·rust
luj_17681 小时前
从R语言想起的,。。。
服务器·c语言·开发语言·经验分享·算法
森G1 小时前
45、QGraphicsScene 与 QGraphicsView 框架---------绘图
c++·qt