【C++11】智能指针

news/2024/12/29 17:35:38/

什么是智能指针:

        智能指针是一个,用来存储指向动态分配对象的指针,负责自动释放动态分配的对象,防止堆内存泄漏。动态分配的资源,交给一个类对象去管理,当类对象声明周期结束时,自动调用析构函数释放资源。

 裸指针的缺点:

1.难区分执行一个或多个对象

2.难以判断是否该销毁,有没有多次销毁

3.难以缺点delete还是delete[]

常见智能指针:

auto_ptr、unique_ptr、shared_ptr、weak_ptr;

auto_ptr在C++11中被舍弃:不支持对象数组操作、赋值和复制会改变资源的所有权。

RAII获取资源即初始化

        充分地利用了c++语言局部对象自动销毁的特性来控制资源(内存heap、网络套接字、互斥量,文件句柄等)的生命周期。

 RALL过程中的四个步骤

  1. 设计一个类封装资源
  2. 在构造函数中初始化
  3. 在析构函数中执行销毁操作
  4. 使用时定义一个该类的局部对象

unique_ptr唯一型智能指针

        指针、资源一对一。不能两个指针指向一个地址,所以不支持普通赋值和拷贝构造,需要用移动构造和移动赋值。

shared_ptr共享型智能指针

        shared_ptr内有两个指针,_Ptr和_Rep;

_Ptr指向申请的空间,_Rep指向_Uses和_Weaks,创建指针后_Uses默认为1、_Weaks默认为1;

_Uses记录有多少个共享指针指向那个空间;

当_Uses值为0时,_Weaks也变为0,释放空间,指针置为空。

weak_ptr弱指针

        弱引用指针weak_ptr监视shared_ptr的生命周期,没有*->操作。

weak_ptr需要shared_ptr实例来初始化,同样有_Ptr和_Rep,当创建弱指针时,_Weaks+1

use_count()可以获取当前有几个共享性智能指针指向该资源即_Uses的值

//创建弱指针
int main()
{shared_ptr<int> pa(new int(10));weak_ptr<int> wp(pa);
}

expired()方法

        弱指针 expired() 方法用于检查所指向的对象是否已经被销毁,返回值是一个 bool 类型的变量,如果所指向的对象已经被销毁,则返回 true,否则返回 false。

        在某些情况下,我们需要检查所指对象是否还存在,以避免程序出现空指针异常或者未定义行为。这时就可以使用 weak_ptr 的 expired() 方法来判断所指对象是否已经被销毁,从而避免出现访问已经不存在的对象的情况。

lock()方法

        lock()方法获取所监视的shared_ptr

       弱指针是一种不拥有所指对象的智能指针,它只是对所指对象的一个观察者,因此它不能直接访问所指对象,而是需要通过转换为 shared_ptr 或者使用 lock() 方法获取一个 shared_ptr,然后才可以访问所指对象。

对于lock()返回的共享型智能指针一定要判断一下是否存在,存在与不存在lock都会返回指针。

shared_ptr<int>sp(new int(10));
weak_ptr<int> gw(sp);
shared_ptr<int>spt = gw.lock();
if(spt)
{//使用spt
}


http://www.ppmy.cn/news/84240.html

相关文章

js数组常用的方法

push():将一个或者多个元素添加到数组的末尾&#xff0c;并返回数组的新长度pop():从数组末尾删除一个元素&#xff0c;并返回该元素的值shift():从数组的开头删除一个元素&#xff0c;并返回该元素的值unshift():向数组的开头添加一个或者多个元素&#xff0c;并返数组新长度s…

在CTEX文档生成中使用WinEit编辑带有公式符号的中文文档应用举例

CTEX文档生成中使用WinEit编辑带有公式符号的中文文档应用举例 CTEX在编辑文档格式和排版时具有优秀的性能&#xff0c;可批量处理文档格式&#xff0c;该用格式时候也非常快捷。下面举例介绍CTEX文档生成中怎样使用WinEit编辑带有公式符号的中文文档。 1.需要的代码 .在WinEi…

绝对不能错过的7个零基础免费的ChatGPT镜像网站

还在为打不开openai官网烦心&#xff1f;本文帮你实现ChatGPTMidJourney自由(&#xffe3;∇&#xffe3;)/ &#x1f4d2;收集了一些截至目前(2023年5月25日午12:00)可以免费访问&#xff0c;并且零基础也能正常使用的镜像网站&#xff0c;后续将持续维护更新(&#xff61;&a…

怎么提升代驾平台的订单量?

随着互联网的不断发展&#xff0c;出行服务行业也逐渐进入数字化时代。在这个竞争激烈的市场中&#xff0c;怎么提升代驾平台的订单量&#xff1f;是很多出行服务企业共同的难题。 怎么提升代驾平台的订单量&#xff1f;首先我们要知道怎么获客&#xff0c;通过线上和线下&…

档案馆建设标准条文说明

第一章 总则 第一条 本条阐明了本标准的编制目的。 中国是一个历史悠久的文明古国&#xff0c;档案事业的发展源远流长。档案是人类活动的真实记录&#xff0c;是人们认识和把握客观规律的重要依据。借助档案&#xff0c;我们能够更好地了解过去、把握现在、预见未来。档案工…

Vue3(一):创建vue3工程、setup、vue3响应式原理、computed和watch

Vue3&#xff1a;第一章 一、创建Vue3.0工程1.使用vue-cli创建2.使用vite创建 二、Vue3中的响应式1.拉开序幕的setup2.ref函数3.reactive函数4.vue3中响应式的原理&#xff08;1&#xff09;vue2中响应式原理&#xff08;2&#xff09;Vue3中的Proxy 5.reactive和ref的对比6.se…

.net OleDbParameter转SugarParameter

说明原因 &#xff1a; 因公司项目是很早的老项目&#xff0c;底层用的dbhelper数据库操作类&#xff0c; 因需要支持多个数据库&#xff0c;本次是要求支持postgresql数据库,边学边做&#xff0c;期间也遇到了很多postgresql数据库的问题&#xff0c;如果重新改框架、换底层等…

互联网营销推荐算法理论-30分钟理解协同过滤

一、协同过滤概念 不论在淘宝还是京东&#xff0c;你浏览了/购买了某个商品A&#xff0c;后面几天你在该app内总是会在首页看到商品A和商品A相似的商品&#xff0c;背后支撑这种能力的就是推荐系统&#xff0c;而其推荐算法可能就是协同过滤。&#xff08;注&#xff1a;app内…