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

转载 2015年11月17日 22:31:40

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. }  



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

如何回答C++面试中关于智能指针的问题?

如何回答C++面试中关于智能指针的问题? 1、  什么是智能指针? 2、  分析下常见的智能指针有哪些? 3、实现一个智能指针呗?(没具体说写哪个,建议默认写:unique_ptr) 1、答:智能指针...

智能指针的作用与原理

对于C/C++程序员来说,指针是天堂,同时指针也是地狱。指针有多少好处,又有多少让人头疼的问题我们这里就不多说了。但为了局部解决指针的问题,我们提出了智能指针这个概念。   实际上,我一直不明白,...

四种智能指针的用法和原理

智能指针共分为4种,即boost库中的auto_ptr、scoped_ptr、shared_ptr、weak_ptr。   智能指针的作用是管理一个指针,因为存在以下这种情况:申请的空间在函数结束时...

C++学习笔记(十) 内存机制与Allocator

C++为我们提供了安全的内存空间申请方式与释放方式,但是new与delete表达式却是把空间的分配回收与对象的构建销毁紧紧的关联在一起。实际上,作为与C语言兼容的语言,C++也为我们提供了更加底层的内...

Java工程师技术栈--成神之路

一、基础篇   1.1 JVM   1.1.1. Java内存模型,Java内存管理,Java堆和栈,垃圾回收 http://www.jcp.org/en/jsr/detail?...

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

普通C++面试时候的一般都是这个套路:      1,C++和C相比最大的特点——面向对象:封装,继承,多态。      2,你知道虚函数吗?——实现多态所必须,父类类型的指针指向子类的实例,执行的时...

C/C++知识要点5——智能指针原理及自定义实现

智能指针概述: 智能指针用来管理动态对象。其行为类似于常规指针,重要的区别是:它负责自动释放所指向的对象。 C++ 11标准库提供两种智能指针:shared_ptr、unique_ptr 区别是...

C++ 智能指针shared_ptr模板实现原理

C++ 智能指针shared_ptr通过引用计数来管理指向的对象,不需要人工释放 这篇博文主要是讲解了智能指针的实现原理,怎么实现引用计数 #include using namespace s...
  • szqsdq
  • szqsdq
  • 2017年05月07日 15:07
  • 306

c++智能指针的原理与简单实现

一、问题的引入 先看一段简单的代码如下: #include using namespace std; class Person { private: char *name ; public: ...

C++中智能指针的工作原理和简单实现

智能指针:它的一种通用实现方法是采用引用计数的方法。智能指针将一个计数器与类指向的对象相关联,引用计数跟踪共有多少个类对象共享同一指针。     每次创建类的新对象时,初始化指针并将引用计数置为1;...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++面试题(四)——智能指针的原理和实现
举报原因:
原因补充:

(最多只允许输入30个字)