首页 > 其他分享 >6.智能指针的作用

6.智能指针的作用

时间:2023-08-02 22:24:20浏览次数:30  
标签:计数 对象 智能 引用 shared ptr 作用 指针

6.智能指针的作用

1.C++11中引入了智能指针的概念,方便管理堆内存。使用普通指针,容易造成堆内存泄露(忘记释放),二次释放,程序发生异常时内存泄露等问题等,使用智能指针能更好的管理堆内存。

2.智能指针在C++11版本之后提供,包含在头文件<memory>中,shared_ptr、unique_ptr、weak_ptr。shared_ptr多个指针指向相同的对象。shared_ptr使用引用计数,每一个shared_ptr的拷贝都指向相同的内存。每使用他一次,内部的引用计数加1,每析构一次,内部的引用计数减1,减为0时,自动删除所指向的堆内存。shared_ptr内部的引用计数是线程安全的,但是对象的读取需要加锁。

3.初始化。智能指针是个模板类,可以指定类型,传入指针通过构造函数初始化。也可以使用make_shared函数初始化。不能将指针直接赋值给一个智能指针,一个是类,一个是指针。例如

std::shared_ptr<int> p4 = new int(1);

的写法是错误的

拷贝和赋值。拷贝使得对象的引用计数增加1,赋值使得原对象引用计数减1,当计数为0时,自动释放内存。后来指向的对象引用计数加1,指向后来的对象

4.unique_ptr“唯一”拥有其所指对象,同一时刻只能有一个unique_ptr指向给定对象(通过禁止拷贝语义、只有移动语义来实现)。相比与原始指针unique_ptr用于其RAII的特性,使得在出现异常的情况下,动态资源能得到释放。unique_ptr指针本身的生命周期:从unique_ptr指针创建时开始,直到离开作用域。离开作用域时,若其指向对象,则将其所指对象销毁(默认使用delete操作符,用户可指定其他操作)。unique_ptr指针与其所指对象的关系:在智能指针生命周期内,可以改变智能指针所指对象,如创建智能指针时通过构造函数指定、通过reset方法重新指定、通过release方法释放所有权、通过移动语义转移所有权。

5.shared_ptr智能指针类将一个计数器与类指向的对象相关联,引用计数跟踪该类有多少个对象共享同一指针。每次创建类的新对象时,初始化指针并将引用计数置为1;当对象作为另一对象的副本而创建时,拷贝构造函数拷贝指针并增加与之相应的引用计数;对一个对象进行赋值时,赋值操作符减少左操作数所指对象的引用计数(如果引用计数为减至0,则删除对象),并增加右操作数所指对象的引用计数;调用析构函数时,构造函数减少引用计数(如果引用计数减至0,则删除基础对象)。

6.weak_ptr 是一种不控制对象生命周期的智能指针,它指向一个 shared_ptr 管理的对象。进行该对象的内存管理的是那个强引用的 shared_ptr。weak_ptr只是提供了对管理对象的一个访问手段。weak_ptr 设计的目的是为配合 shared_ptr 而引入的一种智能指针来协助 shared_ptr 工作,它只可以从一个 shared_ptr 或另一个 weak_ptr 对象构造,它的构造和析构不会引起引用记数的增加或减少。

标签:计数,对象,智能,引用,shared,ptr,作用,指针
From: https://www.cnblogs.com/codemagiciant/p/17601932.html

相关文章

  • 10.智能指针出现循环引用怎么解决
    10.智能指针出现循环引用怎么解决?弱指针用于专门解决shared_ptr循环引用的问题,weak_ptr不会修改引用计数,即其存在与否并不影响对象的引用计数器。循环引用就是:两个对象互相使用一个shared_ptr成员变量指向对方。弱引用并不对对象的内存进行管理,在功能上类似于普通指针,然而一个比......
  • 9.手写实现智能指针类需要实现哪些函数?
    9.手写实现智能指针类需要实现哪些函数?1.智能指针是一个数据类型,一般用模板实现,模拟指针行为的同时还提供自动垃圾回收机制。它会自动记录SmartPointer<T*>对象的引用计数,一旦T类型对象的引用计数为0,就释放该对象。除了指针对象外,我们还需要一个引用计数的指针设定对象的值,并将......
  • 8.智能指针的循环引用
    8.智能指针的循环引用循环引用是指使用多个智能指针share_ptr时,出现了指针之间相互指向,从而形成环的情况,有点类似于死锁的情况,这种情况下,智能指针往往不能正常调用对象的析构函数,从而造成内存泄漏。举个例子:#include<iostream>usingnamespacestd;template<typenameT>cl......
  • 3.使用智能指针管理内存资源,RAII是怎么回事?
    3.使用智能指针管理内存资源,RAII是怎么回事?什么是RAII?RAII是ResourceAcquisitionIsInitialization(wiki上面翻译成“资源获取就是初始化”)的简称,是C++语言的一种管理资源、避免泄漏的惯用法。利用的就是C++构造的对象最终会被销毁的原则。RAII的做法是使用一个对象,在其构造时......
  • 6.关于this指针你知道什么?全说出来
    6.类的*this指针有以下特点1.每个对象都有一个隐藏的this指针,但不属于对象,是编译器添加的2.this只能在成员函数中使用。全局函数、静态函数都不能使用this。实际上,成员函数默认第一个参数为T*constthis。如:classA{public: intfunc(intp) { }};其中,func的原型在......
  • JS作用域
    全局作用域全局作用域变量:直接用var,const,let声明的变量局部作用域局部作用域变量:块,函数,对象,{}中声明的变量局部声明全局变量方法:JS中的作用域问题成为执行上下文,分为全局上下文和局部上下文JS中有一个概念作用域链(scopechain)表示上下文间的关系.和C++中的全局......
  • C++逆向分析——this指针
    this指针概述C++是对C的拓展,C原有的语法C++都支持,并在此基础上拓展了一些语法:封装、继承、多态、模板等等。C++拓展新的语法是为了让使用更加方便、高效,这样就需要编译器多做了很多事情,接下来我们就需要一一学习这些概念。封装之前我们学习过结构体这个概念,那么结构体可以做参数传......
  • 什么是智能一体化机柜?
     智能一体化机柜是一种集成了多种功能的设备,用于存放和管理计算机硬件、网络设备以及机房相关设备。它不仅仅是一个普通的机柜,而是在机柜内集成了液冷系统、环境监控、智能配电、智能机柜管理等功能。通过这些功能,智能一体化机柜可以实现对机房环境、设备状态和能耗等方面的实时......
  • 基于工业物联网平台的智能电网系统有何功能
    电力系统促进了我国各行各业的发展的人们生活水平的提高,很多重要行业都离不开电力系统的支持,因此,以智能电网为代表的新型电力系统受到很多关注和重视。 智能电网是利用物联网技术、数据通信技术与电网基础结合在一起的现代化电网。数之能提供了工业数据采集平台,实现了传感监测、制......
  • TSINGSEE青犀视频智能视频监控EasyCVR如何将实时监控视频流分享出去?
    开源EasyDarwin视频监控平台EasyCVR能在复杂的网络环境中,将分散的各类视频资源进行统一汇聚、整合、集中管理,在视频监控播放上,TSINGSEE青犀视频安防监控平台可支持1、4、9、16个画面窗口播放,可同时播放多路视频流,也能支持视频定时轮播。有新用户部署了EasyCVR安防视频平台后,咨......