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

  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 }
时间: 2024-10-08 17:57:40

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

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

目录 理解智能指针的原理 智能指针的使用 智能指针的设计和实现 1.智能指针的作用 C++程序设计中使用堆内存是非常频繁的操作,堆内存的申请和释放都由程序员自己管理.程序员自己管理堆内存可以提高了程序的效率,但是整体来说堆内存的管理是麻烦的,C++11中引入了智能指针的概念,方便管理堆内存.使用普通指针,容易造成堆内存泄露(忘记释放),二次释放,程序发生异常时内存泄露等问题等,使用智能指针能更好的管理堆内存. 理解智能指针需要从下面三个层次: 从较浅的层面看,智能指针是利用了一种叫做RAII(资

智能指针的原理和简单实现

什么是智能指针? 智能指针实质上是一个类,定义一个类来封装资源的分配和释放.这个类的构造函数中传入一个指针,完成资源的分配和初始化.在析构函数中释放传入的该指针,完成资源的释放. 为什么要用智能指针? 智能指针就是智能,自动化的管理指针所指向的动态资源. 例如以下情况:代码中经常会忘记释放动态开辟的内存资源,导致内存泄露. // case1 void Test2() {  int* p1 = new int(2);  bool isEnd = true;  //...  if (isEnd)  

智能指针的原理与设计

     智能指针:实际指行为类似于指针的类对象 ,它的一种通用实现方法是采用引用计数的方法.下面我们来看看智能指针实现的原理和方法: 1.智能指针将一个计数器与类指向的对象相关联,引用计数跟踪共有多少个类对象共享同一指针: 2.每次创建类的新对象时,初始化指针并将引用计数置为1: 3.当对象作为另一对象的副本而创建时,拷贝构造函数拷贝指针并增加与之相应的引用计数: 4.对一个对象进行赋值时,赋值操作符减少左操作数所指对象的引用计数(如果引用计数为减至0,则删除对象),并增加右操作数所指对象

Chromium和WebKit的智能指针实现原理分析

C++不像Java一样,由虚拟机负责对象分配和释放.也就是说,开发人员使用C++编写代码时,要自己负责对象分配和释放.WebKit和Chromium都是使用C++开发的,因此它们也面临上述问题.在解决对象释放问题时,要做到在对象不需要时自动释放,因为手动释放会带来忘记释放或者释放后又继续使用的隐患.智能指针是实现对象自动释放的有效技术手段.本文就分析Chromium和WebKit的智能指针的实现. 老罗的新浪微博:http://weibo.com/shengyangluo,欢迎关注! 在现实中,

C++智能指针梳理

C++智能指针梳理 参考: https://en.wikipedia.org/wiki/Memory_leak (维基百科,内存泄漏) https://en.wikipedia.org/wiki/Resource_leak (维基百科,资源泄漏) http://blog.csdn.net/dangercheng/article/details/12618161(内存泄露和野指针的概念) http://blog.csdn.net/na_he/article/details/7429171 (内存泄

智能指针 与 oc中的指针

智能指针 与 oc中的指针 智能指针的原理及实现 当类中有指针成员时,一般有两种方式来管理指针成员:一是采用值型的方式管理,每个类对象都保留一份指针指向的对象的拷贝:另一种更优雅的方式是使用智能指针,从而实现指针指向的对象的共享. 智能指针(smart pointer)的一种通用实现技术是使用引用计数(reference count).智能指针类将一个计数器与类指向的对象相关联,引用计数跟踪该类有多少个对象共享同一指针. 每次创建类的新对象时,初始化指针并将引用计数置为1:当对象作为另一对象的副

【C/C++学院】0904-boost智能指针/boost多线程锁定/哈希库/正则表达式

boost_array_bind_fun_ref Array.cpp #include<boost/array.hpp> #include <iostream> #include <string> using namespace std; using namespace boost; void mainA () { array <int, 5> barray = { 1, 2, 3, 4, 5 }; barray[0] = 10; barray.at(4)

【C++】智能指针简述(六):智能指针总结及补充

本文我们主要来总结一下前文介绍过的智能指针相关原理及实现,顺便补充一下前文未提到的shared_ptr删除器部分的内容. 总结: 1.智能指针,通过RAII机制,构造对象时完成资源的初始化,析构对象时,对资源进行清理和汕尾. 2.auto_ptr,防止拷贝/赋值对象后,析构时多次delete对象导致程序崩溃,因此它通过"转移所有权",完成赋值/拷贝,保证只有一个对象维护.释放指针.实际开发中,并不常用. 3.scoped_ptr与auto_ptr类似,只是它不会"转移所有权&

C++在设计和使用智能指针

为一个C++用户的.使用指针可以算的上是常态,但在使用过程中.多的时间,可能是由于new要么malloc对象,上次忘记的释放结束(我会犯这样一个错误).内存泄露. 而此时智能指针可能能够帮助我去解决问题. 智能指针(smart pointer)是利用个引用计数的策略去处理指针的释放,从而保证指针的安全性. 通常情况下,我们会自己去设计一个智能指针类去管理自己的指针对象. 事实上其原理是存储指向动态分配的指针对象类.通过引用计数的功能去控制,去正确的实现指针对象的销毁,从而避免内存泄露. 智能指针