RAII智能指针

RAII
resource acquisition is initialization RAII是利用对象声明周期来控制程序资源的简单技术
在对象构造时获取资源,控制着对资源的访问使之在对象的生命周期内始终保持有效,最后在对象析构的时候释放资源。借此,我们实际上把管理一份资源的责任托管给一个对象
好处:
①.不需要显式地释放资源
②.采用这种方式,对象所需的资源在其生命周期内始终有效
智能指针
auto_ptr
智能指针本质就是一个类模板,可以创建任意类型的指针对象,当智能指针对象使用完后,对象就会自动调用析构函数去释放指针所指向的空间

template<class T>
class auto_ptr{auto_ptr(T*ptr)_ptr(ptr){}   auto_ptr(auto_ptr<T>&ap):_ptr(ap._ptr){ap._ptr=nullptr;}auto_ptr<T>&operartor=(auto_ptr<T>&ap){if(_ptr!=ap._ptr_){ _ptr=ap._ptr;_ap._ptr=nullptr;}return *this;}}~auto_ptr(){if(_ptr){delete _ptr;_ptr=nullptr;}}T&operator(){return *_ptr;}T*operator->(){return _ptr;}private:T*_ptr;
}

auto_ptr管理权转移,最后一个拷贝对象管理资源,被拷贝对象都置空
原对象拷贝给新对象时,原对象就会被设置为nullptr,此时只有新对象指向一块资源空间
如果auto_ptr调用拷贝构造函数或者赋值重载函数后再去使用原来的对象,由于原对象已被设置成nullptr,程序可能崩溃
关于库auto_ptr的其它函数
release,reset
在这里插入图片描述在这里插入图片描述

auto_ptr myAutoPtr(new int(42));
// 释放内存并设置新值
myAutoPtr.reset(new int(99));
// 释放所有权而不析构对象
int* releasedPtr = myAutoPtr.release();
// 此时,myAutoPtr 不再拥有内存的所有权
// 不要忘记手动删除内存,因为所有权已被释放
delete releasedPtr;

unique_ptr

template<class T>
class  unique_ptr{public:unique_ptr(T*ptr):_ptr(ptr){}~unique_ptr(){delete _ptr;}T&operator*(){return  *_ptr;}T*operator->(){return _ptr;}unique_ptr<T>operartor=(const unique_ptr<T>&up)=delete;unique_ptr(const unique_ptr<T>&up)=delete;private:T*_ptr;
}

shared_ptr
shared_ptr采用的是引用计数原理来实现多个shared_ptr之间共享资源
shared_ptr在内部维护着一份引用计数,用来记录该资源被几个对象共享
当一个shared_ptr对象被销毁时(调用析构函数),析构函数内就会将该计数减1
如果引用计数减为0,则表示自己是最后一个使用该资源的shared_ptr对象,必须释放
如果引用计数不是0,就说明自己还有其他对象在使用,则不能释放资源,否则其他对象就成为野指针

template<class T>
class shared_ptr{shared_ptr(T*ptr=nullptr):_ptr(ptr),_pcount(new int(1)){}template<class D>shared_ptr(T*ptr,D del):_ptr(ptr),_pcount(new int(1)),_del(del){}void release(){if(--*(_pcount)==0){_del(_ptr);delete _pcount;}}shared_ptr(const shared_ptr<T>&sp):_ptr(sp._ptr):_pcount(sp._pcount){*(_pcount)++;}shared_ptr<T>operator=(const shared_ptr<T>&sp){if(_ptr!=sp._ptr){release();_ptr=sp._ptr;_pcount=sp._pcount;++(*_pcount);}return *this;}~shared_ptr(){release();}T&operator*(){return *_ptr;}T*operator->(){return  _ptr; }int use_count()const{return *_pcount;}T*get()const{return _ptr;}private:T*_ptr;int*_pcount;//定制删除器function<void(T*)>del=[](T*ptr){delete ptr;};
}

shared_ptr的循环引用
shared_ptr固然好用,但是它也会有问题存在。假设我们要使用定义一个双向链表,如果我们想要让创建出来的链表的节点都定义成shared_ptr智能指针,那么也需要将节点内的_pre和_next都定义成shared_ptr的智能指针。如果定义成普通指针,那么就不能赋值给shared_ptr的智能指针。
weak_ptr类的对象它可以指向shared_ptr,并且不会改变shared_ptr的引用计数。一旦最后一个shared_ptr被销毁时,对象就会被释放

template<class T>
class weak_ptr{public:weak_ptr():_ptr(nullptr){}weak_ptr(const shared_ptr<T>&sp):_ptr(sp.get()){}
weak_ptr<T>&operator=(const shared_ptr<T>sp){_ptr=sp.get();return *this;
}
T*operator->(){return _ptr;
}
T&operator*(){return *_ptr;
}
private:T*_ptr;};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/288762.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024Web自动化测试的技术框架和工具有哪些?

Web 自动化测试是一种自动化测试方式&#xff0c;旨在模拟人工操作对 Web 应用程序进行测试。这种测试方式可以提高测试效率和测试精度&#xff0c;减少人工测试的工作量和测试成本。在 Web 自动化测试中&#xff0c;技术框架和工具起着至关重要的作用。本文将介绍几种常见的 W…

VM安装Sonoma【笔记】

VMware Workstation安装MacOS Sonoma 1、配置虚拟机&#xff0c;根据系统性能调整参数&#xff1b; 2、先不焦急启动虚拟机&#xff0c;打开虚拟机存储目录&#xff0c;以文本方式打开.vmx文件&#xff08;这里以Sonoma.vmx为例&#xff09;&#xff1b; 这里只针对Inter CP…

vue-springboot二手图书商城交易系统ij5dr

本系统依赖于MySQL数据库来储存信息&#xff0c;系统完成后&#xff0c;所有需要的数据都要从数据库中读取&#xff0c;这也意味着无论是插入、更新还是删除操作&#xff0c;只要对数据有改动的操作都需要与数据库交互&#xff0c;因此&#xff0c;系统的全部数据都要储存在数据…

C++相关闲碎记录(18)

1、strftime()的转换指示器 #include <locale> #include <chrono> #include <ctime> #include <iostream> #include <exception> #include <cstdlib> using namespace std;int main () {try {// query local time:auto now chrono::syste…

Python 多维数组详解(numpy)

文章目录 1 概述1.1 numpy 简介1.2 ndarray 简介 2 数组操作2.1 创建数组&#xff1a;array()2.2 裁切数组&#xff1a;切片2.3 拼接数组&#xff1a;concatenate()2.4 拆分数组&#xff1a;array_split()2.5 改变数组形状&#xff1a;reshape() 3 元素操作3.1 获取元素&#x…

飞天使-k8s知识点1-kubernetes架构简述

文章目录 名词功能要点 k8s核心要素CNCF 云原生框架简介k8s组建介绍 名词 CI 持续集成, 自动化构建和测试&#xff1a;通过使用自动化构建工具和自动化测试套件&#xff0c;持续集成可以帮助开发人员自动构建和测试他们的代码。这样可以快速检测到潜在的问题&#xff0c;并及早…

【QT】解决QTableView修改合并单元格内容无法修改到合并范围内的单元格

问题:修改合并单元格的内容 修改合并单元格的内容时,希望直接修改到合并范围内的单元格,Qt没有实现这个功能,需要自己写出 Delegate来实现 方案:Delegate class EditDelegate : public QStyledItemDelegate {public:EditDelegate(QTableView *view): tableView(view){}pu…

位操作符详解(C语言)

前言 C语言中的位操作符是用来对数据的二进制表示进行位级操作的运算符。这些操作符包括位与&#xff08;&&#xff09;、位或&#xff08;|&#xff09;、位异或&#xff08;^&#xff09;、位取反&#xff08;~&#xff09;&#xff0c;这些位操作符可以用来进行各种位级…

华为选择“力图生存”!国家队正式出手,外媒:鸿蒙将全面爆发

引言 在国际舞台上&#xff0c;国与国之间的关系错综复杂&#xff0c;舆论的力量也十分重要。近日&#xff0c;关于华为鸿蒙系统失去用户的预测成为热议的话题。这背后所面对的挑战和对抗也异常严峻。本文将解释鸿蒙系统的崛起与前景展望&#xff0c;揭示其中的机遇与挑战。 …

9ACL访问控制列表

为什么要有访问控制&#xff08;Access Control List&#xff09;&#xff1f; 因为我可能在局域网中提供了一些服务&#xff0c;我只希望合法的用户可以访问&#xff0c;其他非授权用户不能访问。 原理比较简单&#xff0c;通过对数据包里的信息做过滤&#xff0c;实现访问控…

《每天一分钟学习C语言·三》

1、 scanf的返回值由后面的参数决定scanf(“%d%d”,& a, &b); 如果a和b都被成功读入&#xff0c;那么scanf的返回值就是2如果只有a被成功读入&#xff0c;返回值为1如果a和b都未被成功读入&#xff0c;返回值为0 如果遇到错误或遇到end of file&#xff0c;返回值为EOF…

华清远见作业第十三天

1.使用多文件编辑&#xff0c; 定义商品信息:商品名称&#xff0c;商品单价&#xff0c;商品购买个数&#xff0c;商品描述&#xff0c;循环输入购买的商品&#xff0c;按单价排序&#xff0c;输出商品信息&#xff0c;计算最贵的商品以及一共花了多少钱? 在create函数&#x…