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

tanglu2004
http://blog.csdn.net/worldwindjp/
 

  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, 智能指针的实现

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

 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 }

转载于:https://www.cnblogs.com/Jun-cd/p/4343311.html

【转】C++面试题(四)——智能指针的原理和实现相关推荐

  1. C++中智能指针的原理、使用、实现

    C++中智能指针的原理.使用.实现 转自:https://www.cnblogs.com/wxquare/p/4759020.html 1 智能指针的作用 C++程序设计中使用堆内存是非常频繁的操作, ...

  2. c++11中智能指针的原理,使用,实现

    文章目录 理解智能指针的原理 智能指针的使用 shared_ptr的使用 unique_ptr的使用 weak_ptr的使用 循环引用 指针指针的设计和实现: 理解智能指针的原理 c++程序设计中使用 ...

  3. C++新特性探究(十八):智能指针

    一.智能指针及RAII 问题:   C++中最令人头疼的问题是强迫程序员对申请的资源(文件,内存等)进行管理,一不小心就会出现泄露(忘记对申请的资源进行释放)的问题. C++的解决办法:RAII    ...

  4. 智能指针的释放_看完这篇,别再说不会智能指针了

    C++智能指针 一.智能指针的作用 上一篇介绍了内存池的原理和实现,详情请见内存池设计与实现: 内存池可以帮助我们有效的对内存进行管理,智能指针可以很方便的管理指针,避免出现内存泄漏: 智能指针的作用 ...

  5. 道高一尺 魔高一丈 内存泄漏智能指针

    一.什么是内存泄漏 内存泄漏是指程序中已动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果. 内存泄漏主要分为两类: 1. 堆内存泄漏 堆 ...

  6. 初识C++之智能指针

    目录 一.智能指针的概念 二.RAII 三. 智能指针的拷贝构造 1. 智能指针的拷贝构造问题 2. C++库中的智能指针 2.1 auto_ptr 2.2 unique_ptr 2.3 shared ...

  7. C++异常处理机制由浅入深, 以及函数调用汇编过程底层刨析. C++11智能指针底层模拟实现

    一. 异常 1.1.异常的编程模型和基本使用 咱得用一用, 解释一下上述的模型    double Div(int a, int b) {if (b == 0) throw "Zero Di ...

  8. c++系列 —— 智能指针auto_ptr和unique_ptr

    往期地址: c++系列一 -- c++的封装 c++系列二 -- c++的继承 c++系列三 -- 继承和多态特性 c++系列四 -- 运算符重载 c++系列五 -- 静态成员和静态类 c++系列六 ...

  9. 深入掌握C++智能指针

    知识的学习在于点滴记录,坚持不懈:知识的学习要有深度和广度,不能只流于表面,坐井观天:知识要善于总结,不仅能够理解,更知道如何表达! 目录 智能指针介绍 自己实现智能指针 不带引用计数的智能指针 带引 ...

最新文章

  1. php No 'Access-Control-Allow-Origin' header is present on the requested resource.'Ajax跨域访问解决方法
  2. log4j2的配置文件log4j2.xml笔记
  3. 禁止右键 巧妙破解右键被禁的方法
  4. java如何接收邮件_java Exchange服务接收邮件
  5. flex4.6 图表 在module中 x轴旋转正确的做法
  6. 第四范式陈雨强:万字深析工业界机器学习最新黑科技 By 机器之心2017年7月25日 16:38 近日,全球最顶级大数据会议 Strata Data Conference 在京召开。Strata 大
  7. zookeeper集群自动启动脚本
  8. centos5.8上安装git server
  9. java long常量池_Java提高篇之常量池
  10. ES查询-基本查询续
  11. 美团员工被指用钓鱼邮件获拼多多薪资;华为回应暂无其它手机厂商接入HarmonyOS;GCC 放弃版权转让政策|极客头条...
  12. python中nums.append_Python程序中的append()和extend()
  13. java程序中空一阁_如何使用JFlex、JavaCUP(详细代码模版) by 踏雪赤兔
  14. 解决谷歌浏览器添加插件时显示程序包无效:“CRX_HEADER_INVALID“
  15. eyoucms栏目类型介绍
  16. 电脑故障维修判断指导大全(联想内部文件)[网络转载]
  17. 【向生活低头】用python提取gif动图的每一帧为png格式
  18. JSP是什么?JSP是什么意思?
  19. 全国电费优惠充值接口源码
  20. 生僻字用计算机弹的数字,抖音生僻字计算器乐谱完整版 抖音生僻字计算器数字简谱...

热门文章

  1. linux的bash与sh的区别
  2. 新电脑装不了win7?来试试我的方法!
  3. delphi中关于时间差的实例
  4. shell中的特殊变量
  5. asp.net MVC 中 Session统一验证的方法
  6. Centos7下安装apache2.4 php5.6 pdo_oci oci8
  7. 十大开源的.NET用户界面框架 让GUI设计不再犯难
  8. fiddler 在火狐(firefox)下无效的问题 ——Fiddler监听Firefox、Chrome中的http请求
  9. Windows Azure 架构指南 – 第 1卷 发布
  10. SharePoint2010 内容类型剖析