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是最常用也是最推荐的智能指针。


三.内存泄漏

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

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


结语

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

相关推荐
承渊政道10 小时前
【动态规划算法】(子序列问题解题框架与典型案例)
数据结构·c++·学习·算法·leetcode·macos·动态规划
Rust研习社10 小时前
Rust 高性能内存缓存 moka 完全指南
开发语言·后端·缓存·rust
鸟儿不吃草10 小时前
Android Java 自定义TextView点击取词,类似百度翻译的点击一段英文中的某个单词,可以显示点击了哪个单词
android·java·开发语言
_F_y10 小时前
仿RabbitMQ实现消息队列-服务端核心模块实现(3)
c++·算法·rabbitmq
wefg110 小时前
【C语言】用 C 语言实现多态
c语言·开发语言
橙子也要努力变强11 小时前
进程与信号
linux·服务器·c++
threelab11 小时前
Three.js 动态旋转同心圆着色器 | 三维可视化效果
开发语言·javascript·着色器
我不是懒洋洋11 小时前
手写一个B+树:从原理到数据库索引实战
c语言·c++·经验分享
奶茶树11 小时前
【STL/数据结构】哈希表和unordered系列容器的封装
开发语言·c++·散列表
Brilliantwxx11 小时前
【C++】初步认识STL(3)
开发语言·c++·笔记·算法