Chromium 智能指针实现

来源:互联网 发布:淘宝商品标题优化 编辑:程序博客网 时间:2024/06/05 06:54

    出现智能指针的初衷?

     C++ 没有虚拟机负责对象分配和释放的机制,需要程序员自己负责分配还是释放而手动释放会带来疏漏,因此就出现了能自动适当的对象的智能指针技术手段。

      智能指针划分为两类。第一类智能指针引用的对象是可以共享的,也就是一个对象可以同时被多个智能指针引用。这类智能指针要求被引用的对象具有计数的功能,数值的大小就表示它目前被多少个智能指针引用。当一个对象的引用计数值等于0的时候,就表示它要被释放了。这类智能指针适合作为函数参数或者返回值在模块之间进行传递,从而实现共享。第二类智能指针不要求被引用对象具有计数的功能。

           第二类智能指针引用的对象是独占的,也就是一个对象同一时刻只可以被一个智能指针引用。这类智能指针不要求被引用对象具有计数的功能。只要这类智能指针的生命周期超出了它自己的范围,那么它引用的对象就会被自动销毁。这类智能指针适合在函数或者内部使用,用来自动化释放那些不需要了的对象。此外,WebKit和Chromium还提供了弱智能指针。所谓弱智能指针,就是它们的存在不会影响到被引用对象的生命周期。它们适合用来解决对象之间存在循环引用时的释放问题。


  1. template<typename T>  
  2. struct IsRefCounted {  
  3.     static const bool value = IsSubclass<T, RefCountedBase>::value  
  4.         || IsSubclass<T, ThreadSafeRefCountedBase>::value;  
  5. };  
如果模板参数T是从RefCountedBase类或者ThreadSafeRefCountedBase类继承下来的,那么模板类IsRefCounted<T>的静态成员变量value就会等于true。


Chromium的第一类智能指针由类scoped_refptr实现。由于它要求被引用对象具有计数功能,因此就提供了一个具有计数功能的基类RefCounted。当一个对象可以被类scoped_refptr描述的对象引用时,它就必须要从基类RefCounted继承下来。这一点与WebKit的第一类智能指针RefPtr是类似的。

       Chromium的RefCounted类的实现如下所示:

[cpp] view plain copy
  1. template <class T>  
  2. class RefCounted : public subtle::RefCountedBase {  
  3.  public:  
  4.   RefCounted() {}  
  5.   
  6.   void AddRef() const {  
  7.     subtle::RefCountedBase::AddRef();  
  8.   }  
  9.   
  10.   void Release() const {  
  11.     if (subtle::RefCountedBase::Release()) {  
  12.       delete static_cast<const T*>(this);  
  13.     }  
  14.   }  
  15.   
  16.  ......  
  17. };  

1.智能删除指针scoped_ptr

用作对普通指针的转储,防止忘记delete或不知道哪里delete。它跟引用计数没有关系。

头文件的注释就是使用示例

http://src.chromium.org/viewvc/chrome/trunk/src/base/memory/scoped_ptr.h

template <class T, class D = base::DefaultDeleter<T> > class scoped_ptr

其中Deleter可以被替换,默认的Deleter区分是要delete普通指针还是指针数组,或者用free函数删除malloc的内存。


原创粉丝点击