C++面试题(四)——智能指针的原理和实现

2023-11-17

C++面试题(一)、(二)和(三)都搞定的话,恭喜你来到这里,这基本就是c++面试题的最后一波了。

     1,你知道智能指针吗?智能指针的原理。
     2,常用的智能指针。
     3,智能指针的实现。

  1答案:智能指针是一个类,这个类的构造函数中传入一个普通指针,析构函数中释放传入的指针。智能指针的类都是栈上的对象,所以当函数(或程序)结束时会自动被释放,

     2, 最常用的智能指针: 

              1)std::auto_ptr,有很多问题。 不支持复制(拷贝构造函数)和赋值(operator =),但复制或赋值的时候不会提示出错。因为不能被复制,所以不能被放入容器中。

              2) C++11引入的unique_ptr, 也不支持复制和赋值,但比auto_ptr好,直接赋值会编译出错。实在想赋值的话,需要使用:std::move。

               例如:

                    std::unique_ptr<int> p1(new int(5));
                    std::unique_ptr<int> p2 = p1; // 编译会出错
                    std::unique_ptr<int> p3 = std::move(p1); // 转移所有权, 现在那块内存归p3所有, p1成为无效的指针.

              3) C++11或boost的shared_ptr,基于引用计数的智能指针。可随意赋值,直到内存的引用计数为0的时候这个内存会被释放。

              4)C++11或boost的weak_ptr,弱引用。 引用计数有一个问题就是互相引用形成环,这样两个指针指向的内存都无法释放。需要手动打破循环引用或使用weak_ptr。顾名思义,weak_ptr是一个弱引用,只引用,不计数。如果一块内存被shared_ptr和weak_ptr同时引用,当所有shared_ptr析构了之后,不管还有没有weak_ptr引用该内存,内存也会被释放。所以weak_ptr不保证它指向的内存一定是有效的,在使用之前需要检查weak_ptr是否为空指针。

     3, 智能指针的实现

      下面是一个基于引用计数的智能指针的实现,需要实现构造,析构,拷贝构造,=操作符重载,重载*-和>操作符。

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. template <typename T>  
  2. class SmartPointer {  
  3. public:  
  4.     //构造函数  
  5.     SmartPointer(T* p=0): _ptr(p), _reference_count(new size_t){  
  6.         if(p)  
  7.             *_reference_count = 1;   
  8.         else  
  9.             *_reference_count = 0;   
  10.     }  
  11.     //拷贝构造函数  
  12.     SmartPointer(const SmartPointer& src) {  
  13.         if(this!=&src) {  
  14.             _ptr = src._ptr;  
  15.             _reference_count = src._reference_count;  
  16.             (*_reference_count)++;  
  17.         }  
  18.     }  
  19.     //重载赋值操作符  
  20.     SmartPointer& operator=(const SmartPointer& src) {  
  21.         if(_ptr==src._ptr) {  
  22.             return *this;  
  23.         }  
  24.         releaseCount();  
  25.         _ptr = src._ptr;  
  26.         _reference_count = src._reference_count;  
  27.         (*_reference_count)++;  
  28.         return *this;  
  29.     }  
  30.   
  31.     //重载操作符  
  32.     T& operator*() {  
  33.         if(ptr) {  
  34.             return *_ptr;  
  35.         }  
  36.         //throw exception  
  37.     }  
  38.     //重载操作符  
  39.     T* operator->() {  
  40.         if(ptr) {  
  41.             return _ptr;  
  42.         }  
  43.         //throw exception  
  44.     }  
  45.     //析构函数  
  46.     ~SmartPointer() {  
  47.         if (--(*_reference_count) == 0) {  
  48.             delete _ptr;  
  49.             delete _reference_count;  
  50.         }  
  51.     }  
  52. private:  
  53.     T *_ptr;  
  54.         size_t *_reference_count;  
  55.         void releaseCount() {  
  56.         if(_ptr) {  
  57.             (*_reference_count)--;  
  58.                 if((*_reference_count)==0) {  
  59.                     delete _ptr;  
  60.                     delete _reference_count;  
  61.                 }  
  62.         }  
  63.         }  
  64. };  
  65.   
  66. int main()   
  67. {  
  68.     SmartPointer<char> cp1(new char('a'));  
  69.     SmartPointer<char> cp2(cp1);  
  70.     SmartPointer<char> cp3;  
  71.     cp3 = cp2;  
  72.     cp3 = cp1;  
  73.     cp3 = cp3;  
  74.     SmartPointer<char> cp4(new char('b'));  
  75.     cp3 = cp4;  
  76. }  



FROM:  http://blog.csdn.net/worldwindjp/article/details/18843087

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++面试题(四)——智能指针的原理和实现 的相关文章

随机推荐

  • 蓝桥杯在哪下载准考证

    点击自己的头像 gt 我的大赛 gt 会出现如下 gt 点击Java软件开发 根据自己报的方向 gt 可以看到考试信息 gt 下载准考证即可 转载于 https blog 51cto com 13534640 2090954
  • Kafka消息阻塞

    转自 http jis117 iteye com blog 2279519 hi all 大家都很关心kafka消息阻塞的情况 感谢RoctetMQ给我们的教训 Kafka上线也有一段时间了 确实有出现过消息阻塞的情况 虽然不影响业务而且用
  • 判断逻辑关系的运算符 && 与,

    package com test basic chapter2 功能 判断逻辑关系的运算符 与 或 非 与 同为真即真 或 有真即真 非 public class LogicalOperators public static void ma
  • Java中map集合,你真的了解吗?

    在Java编程中 map集合是一个非常重要的数据结构 它可以存储键值对 并且可以根据键快速查找对应的值 今天 我们就来详细介绍一下Java中的map集合 首先 让我们来了解一下map集合的基本概念 在Java中 map集合是一个接口 它有多
  • padding的四个参数_Google Flutter 布局(二)-Padding、Align、Center详解

    1 1 简介 Padding在Flutter中用的也挺多的 作为一个基础的控件 功能非常单一 给子节点设置padding属性 写过其他端的都了解这个属性 就是设置内边距属性 内边距的空白区域 也是widget的一部分 Flutter中并没有
  • 深入理解Java——从入门到精通

    标题 深入理解Java 从入门到精通 Java是一门广泛应用于软件开发领域的高级编程语言 它的特点包括强大的跨平台性 面向对象的编程范式 丰富的类库以及良好的安全性 无论是在企业级应用开发 移动应用开发还是嵌入式系统开发中 Java都扮演着
  • [分享]如何使用Angular中的自定义校验器

    在Angular的开发中表单是必不可少的 由此引出的表单校验也是万万不可缺少的 解决方法一 全部使用ngModel 双向绑定数据 在最后的submit点击时进行所有表单的校验 这样做固然没有什么问题 而且代码写的也和我们之前使用jQuery
  • 单元格法近似求解多边形最大内接矩形问题【思路讲解+java实现】

    文章目录 问题描述 问题解决方案 多边形网格化 区分每个单元格是在多边形内部还是外部 根据已标记单元格寻找最大内接矩形 剪枝优化 多角度旋转 案例测试 代码实现 说明 问题描述 给定一个多边形的点集 希望找出多边形内部面积最大的矩形 该问题
  • SPI机制是什么?

    一 SPI机制是什么 spi全称为 Service Provider Interface 是JDK内置的一种服务提供发现机制 SPI是一种动态替换发现的机制 一种解耦非常优秀的思想 spi的工作原理 就是ClassPath路径下的META
  • 已知三角形三边长怎么求面积_已知三角形三边求面积的公式——海伦公式

    海伦公式又译作希伦公式 海龙公式 希罗公式 海伦 秦九韶公式 传说是古代的叙拉古国王希伦 Heron 也称海龙 二世发现的公式 是一个利用三角形的三条边长直接求三角形面积的公式 下面我们利用初中的知识进行推导 注意 公式推导过程的方法比公式
  • BigDecimal:比double更精确的小数类

    BigDecimal概述 BigInteger是Number的子类 它用来对超过16位有效位的数进行精确的运算 双精度浮点型变量double可以处理16位有效数 在实际应用中 需要对更大或者更小的数进行运算和处理 float和double只
  • Wordpess百度自动推送代码

    直接将代码中的token换成百度站长中自己的即可 将下列代码放入functions php中就行了 WordPress 百度快速收录 API 提交代码 if function exists Baidu Submit function Bai
  • 操作系统实验进程调度模拟

    操作系统实验 实验一 实验1 基于优先数的时间片轮转调度算法调度处理模拟程序设计 一 实验目的 1 对进程调度的工作做进一步的理解 2 了解进程调度的任务 3 通过编程掌握基于优先数的时间片轮转调度算法具体实现过程 二 实验内容及实验要求
  • 遗传算法的实现

    请用遗传算法实现如下最大化问题 首先先来学习下 遗传算法的本质和过程 遗传算法是计算数学中用于解决最佳化的搜索算法 是进化算法的一种 进化算法最初是借鉴了进化生物学中的一些现象而发展起来的 这些现象包括遗传 突变 自然选择以及杂交等 遗传算
  • C#关键字 abstract,override,virtual的用法

    什么是抽象类 abstract关键字修饰的类称为抽象类 抽象类不能被实例化 抽象类是派生类的基类 关键字 abstract 语法 public abstract class 类名 1 一个抽象类可以同时包含抽象方法和非抽象方法 但不能实例化
  • IDEA工具快捷键---补全返回值

    Ctrl alt v 自动提示
  • 接口测试开发之:一篇搞懂 Cache、Cookie及Session的爱恨情仇

    Cashe Cookie与Session 1 引言 2 Cache 2 1 缓存定义 2 1 1 缓存概念 2 1 2 缓存优点 2 2 浏览器缓存 2 2 1 存储路径 2 2 2 缓存优点 2 2 3 缓存弊端 2 2 4 原理图 2
  • 【习题三】【数据库原理】

    文章目录 一 单选题 二 填空题 一 单选题 1 X Y能从推理规则导出的充分必要条件是 正确答案 B 2 设有关系模式R A B C D E 函数依赖集F A B B C C D D A AB BC AD 是R上的一个分解 那么分解 相对
  • [1143]Flink的Checkpoint和Savepoint

    文章目录 Flink的Checkpoint和Savepoint介绍 第一部分 Flink的Checkpoint 1 Flink Checkpoint原理介绍 2 Checkpoint的简单设置 3 保存多个Checkpoint 4 从Che
  • C++面试题(四)——智能指针的原理和实现

    C 面试题 一 二 和 三 都搞定的话 恭喜你来到这里 这基本就是c 面试题的最后一波了 1 你知道智能指针吗 智能指针的原理 2 常用的智能指针 3 智能指针的实现 1答案 智能指针是一个类 这个类的构造函数中传入一个普通指针 析构函数中