【面试八股总结】C++11新特性:智能指针

2024-05-10 00:12

本文主要是介绍【面试八股总结】C++11新特性:智能指针,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

参考资料 :阿秀、代码随想录

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

        C++11提供了两种智能指针,两种智能指针的区别在于管理底层指针的方式shared_ptr允许多个指针指向同一个对象;unique_ptr则“独占”所指向的对象。标准库还定义了一个名为weak_ptr的伴随类,是一种弱引用,指向shared_ptr所管理的对象。

一、 shared_ptr

        采⽤引用计数器的方法,允许多个智能指针指向同⼀个对象,每当多⼀个指针指向该对象时,指向该对象的所有智能指针内部的引用计数加1,每当减少⼀个智能指针指向对象时,引用计数会减1,当计数为0的时候会自动的释放动态分配的资源

1. 使用方法

  • 创建智能指针,需要给出指针可以指向的类型
// 创建智能指针
shared_ptr<string> p1;       // 指向string
shared_ptr<list<int>> p2;    // 指向int的list
  •  分配和使用动态内存 make_shared<T>(args)
shared_ptr<string> p3 = make_shared<string>(10,'9');    // 指向一个值为“9999999999”的字符串

2. 线程安全问题

(1)同⼀个shared_ptr被多个线程“读”是安全的;

(2)同⼀个shared_ptr被多个线程“写”是不安全的;

(3)共享引用计数的不同的shared_ptr被多个线程”写“ 是安全的。

二、 unique_ptr

        采用独享所有权语义,⼀个非空的unique_ptr总是拥有它所指向的资源。转移⼀个unique_ptr将会把所有权全部从源指针转移给目标指针,源指针被置空所以unique_ptr不支持普通拷贝和赋值操作,不能用在 STL标准容器中;局部变量的返回值除外(因为编译器知道要返回的对象将要被销毁);如果你拷贝⼀个unique_ptr,那么拷贝结束后,这两个unique_ptr都会指向相同的资源,造成在结束时对同⼀内存指针多次释放而导致程序崩溃。

1. 创建unique_ptr

        定义unique_ptr时,需要将其绑定到一个new返回的指针上,初始化unique_ptr必须采用直接初始化形式。

unique_ptr<string> p1;           
unique_ptr<int> p2(new int(42)); // p2指向一个值为42的int

2. realese/reset

        虽然不能够拷贝或赋值unique_ptr,但是可以通过调用release和reset将指针的所有权从一个(非const)unique_ptr转移给另一个unique;

unique_ptr<string> p2(p1.release());    // release将p1置空unique_ptr<string> p3(new string("Chesnut"));  
// 将所有权从p3转移给p2
p2.reset(p3.release());    // reset释放p2原本指向空间

3. 传递unique_ptr参数和返回unique_ptr

        不能拷贝unique_ptr的规则有一个例外: 可以拷贝或赋值一个将要被销毁的unique_ptr。最常见的例子就是从函数返回一个unique_ptr。

unique_ptr<int> clone(int p){return unique_ptr<int>(new int(p));
}

三、 weak_ptr 弱引用

        引用计数有⼀个问题就是互相引⽤形成环(环形引用),这样两个指针指向的内存都无法释 放,需要使用weak_ptr打破环形引用

        weak_ptr是⼀个弱引用,它是为了配合shared_ptr而引⼊的⼀种智能指针,它指向⼀个由shared_ptr管理的对象而不影响所指对象的生命周期,也就是说,它只引用,不计数。如果⼀块 内存被shared_ptr和weak_ptr同时引⽤,当所有shared_ptr析构了之后,不管还有没有weak_ptr引⽤该内存,内存也会被释放。所以weak_ptr不保证它指向的内存⼀定是有效的在使用之前使⽤函数lock()检查weak_ptr是否为空指针。

这篇关于【面试八股总结】C++11新特性:智能指针的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/974883

相关文章

Android_03_数据库的使用总结

前言: 1>区分SQL和SQLite SQL 是一门 ANSI 的标准计算机语言,用来访问和操作数据库系统。SQL 语句用于取回和更新数据库中的数据。 SQL 可与数据库程序协同工作,比如 MS Access、DB2、Informix、MS SQL Server、Oracle、Sybase 以及其他数据库系统。 不幸地是,存在着很多不同版本的 SQL 语言,但是为了与 ANSI 标准相

Android图片轮播的实现总结

前言: 在很多app中,我们都可以看到几张图片每隔一段时间就切换一下,这就是我们所称的图片轮播的功能,其主要实现就是用到了ViewPager, 下面我们来着重讲解一下其具体实现 效果图: 步骤一:在XML中添加ViewPager控件 比如: <?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:a

自定义ViewGroup的总结(侧滑特效)

前言: 和自定义View控件一样,我们有时也需要自定义我们想要的ViewGroup,那么此时,我们就需要让其继承ViewGroup,然后重写 里边的onMeasure()和onLayout()方法,下面以侧滑特效为例,来讲解一下自定义ViewGroup所需的流程,关于侧滑特效, 其整体效果图如下: 对于自定义ViewGroup,主要有以下几步: 步骤一:编写ViewGroup

自定义View的总结(自定义滑动开关)

前言: 由于有些控件,在android中样式比较挫,并不能满足我们的需求,此时,我们可以将其进行一个自定义,下面一以一个自定义编写的ToggleButton为例, 来简要说明下,自定义所涉及到的一些步骤;以下是自定义控件ToggleButton的效果图: 其是由两张图片组成的: <1>   <2>  下面我们通过这个示例,来说明下,如何编写一个自定义view控件!!

关于隐藏Android标题栏总结

1>区分状态栏/标题栏/导航栏 状态栏(Status Bar) 标题栏(Title Bar) 导航栏(Navigation Bar) 2>区分Title Bar/Action Bar/Tool Bar Title Bar就是我们所俗称的标题栏,在Android 3.0 (API level 11)的时候,引入的Action Bar,其就是用来取代Title Bar的,

Android的Paint和Canvas的使用总结

前言: 在自定义控件时,我们有时可能会用到Paint和Canvas这两个类, Paint相当于我们在画画时的画笔,Canvs相当于我们在画画时的画布, 下面来简单讲一下这两个类常见的一些用法 Paint的使用总结: setAlpha(int a): 设置画笔的透明度,这样画笔所画的位置就会呈一定的透明度 setAntiAlias(boolean aa): 设置 tr

Android的FragmentTabHost使用总结(顶部或底部菜单栏)

前言: 我们经常看到一些app的自带一些标签,并且可以来回进行切换, 本章我们就通过FragmentTabHost来学习一下其如何实现,效果图如下: 步骤一: 编写布局文件 <android.support.v4.app.FragmentTabHost android:layout_width="match_parent" android:la

Android的RecyclerView使用总结

前言: RecyclerView 小组件比 ListView 更高级且更具灵活性。 此小组件是一个用于显示庞大数据集的容器,可通过保持有限数量的视图进行非常有效的滚动操作。 如果您有数据集合,其中的元素将因用户操作或网络事件而发生改变,请使用RecyclerView 小组件。 RecyclerView  类别将通过提供下列功能简化庞大数据集的显示与处理: 用于项目定位的布局管理器 用于通用项目

java基础—java中使用final关键字的总结

有时候我,们希望某些东西是亘古不变的,可以使用final关键字完成这个重任! final学习总结: 1:final + 属性 如果属性是基本数据类型(byte 字节型short 短整型int 普通整型char 字符型float 浮点型long 长整型double 双精度),则变为常量,其值不能被更改;如果属性是引用类型,则引用地址不能被更改。(final 修饰一个对象,那么这个对象的引用地址

总结这段时间的学习和生活

越来越发现自己活的很狭隘,思想也比较狭隘! 现在的生活是8点每天早上起床,在家吃个早饭,然后骑车去公司。这几天发现走路去公司也就十几分钟,那就走路吧,走路的时候自己也听一听音乐或者一些线上的音频文件,发现早晨走路还是听舒服的,这样也可以简单的锻炼一下身体,从惠州到长沙,很久没有坚持锻炼了。 为什么没有坚持锻炼呢,我给自己找了一些理由,一个是住的地方不方便,一个刚加入新的公司要努力学习,尽