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


三.内存泄漏

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

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


结语

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

相关推荐
统计学小王子16 小时前
数学建模国赛倒计时4天——《统计模型精讲(混合效应模型R语言实现)》
开发语言·数学建模·r语言
知无不研16 小时前
c语言中循环的介绍与简单应用
c语言·开发语言·算法·循环·for·while
郝学胜-神的一滴16 小时前
Qt 高级编程 045:坐标体系深度实战
开发语言·c++·windows·python·qt·程序人生
码匠许师傅17 小时前
【设计模式精讲】22.中介者模式(Mediator)
c++·设计模式·软件工程·uml·中介者模式
dsyyyyy110117 小时前
JS复习,难点,易错点总结
开发语言·javascript·ecmascript
“AI国潮设计-小江”18 小时前
Python实战 | SDXL精准控制“普宁英歌舞×星空蛋糕”IP落地,附核心Prompt与商用授权思路
开发语言·人工智能·python·prompt·aigc
小刘在重生~19 小时前
Java常用类|String类详解 + BigDecimal精准计算(含面试题)
java·开发语言·python
爱吃巧克力的程序媛19 小时前
main.cpp注册 C++ 类到 QML 元对象系统
c++·qt
YYYing.19 小时前
【C++进阶系列 (二)】关于线程堆栈的那些事——函数调用过程
开发语言·c++·函数·线程堆栈
邪修king20 小时前
Re:Linux系统篇(十九):进程篇(八): 进程等待详解:wait/waitpid,僵尸进程到底该如何回收
java·开发语言