Smart pointers to boost your code(智能指针)

来源:互联网 发布:指向整形数组的指针 编辑:程序博客网 时间:2024/05/21 06:38

Smart pointers to boost your code(智能指针)

(2012-03-24 14:07:58)
转载
标签:

it

分类: C/Cplusplus
1.智能指针:各种智能指针能够在任务结束的时候删除对象。
2.boost库提供了下面几种智能指针
 shared_ptr<T> 本指针中有一个引用指针计数器,表示类型T的对象是否已经不再使用.shared_ptr是Boost中提供普通的智能指针。 scoped_ptr<T>当离开作用域能够自动释放的指针。因为它是不传递所有权的。事实上它明确禁止任何传递所有权的企图,用于确保指针任何时候只有一个拥有者。 intrusive_ptr<T> 比shared_ptr更好的智能指针,但那时需要类型T提供自己的指针使用引用计数机制 weak_ptr<T>一个弱指针,帮助share_ptr避免循环引用  shared_ptr<T>和shared_ptr类似,用来处理数组的。  scoped_array<T>和scoped_ptr类似,也是用来处理数组的。 
3.使用详解
(1)scope_ptr<T>

使用普通指针

使用scoped_ptr 指针

void Sample1_Plain()

{

  CSample * pSample(new CSample);

 

  if (!pSample->Query() )

  // just some function...

  {

    delete pSample;

    return;

  }

 

  pSample->Use();

  delete pSample;

}

#include "boost/smart_ptr.h"

 

void Sample1_ScopedPtr()

{

  boost::scoped_ptr<CSample>

       samplePtr(new CSample);

 

  if (!samplePtr->Query() )

  // just some function...

    return;   

 

  samplePtr->Use();

 

}

使用scope_ptr指针就能够在函数结束的时候自动销毁它,但对于函数外创建的指针就无效了。

优点:使用scoped_ptr指针能偶帮助我们能处理那些容易忘记释放的对象,也因此在调试模式下如果使用空指针,就会出现一个断言。

 

优点

自动释放本地对象和成员变量。

缺点

在STL容器里,多个指针操作一个对象的时候需要注意。

性能

使用scoped_ptr 指针,会增加一个普通指针。

(2)引用指针计数器

其记录有多少个引用指针指向同一个对象,弱国最后一个引用指针被销毁的时候,那么就销毁对象本身。

shared_ptr就是Boost中普通的引用指针计数器,它表示可以有多个指针指向同一个对象。

 

void Sample2_Shared()

{

  // (A) 创建Csample类的一个实例和一个引用。

  boost::shared_ptr<CSample> mySample(new CSample);

  printf("The Sample now has %i references\n", mySample.use_count()); // The Sample now has 1 references

  // (B) 付第二个指针给它。

  boost::shared_ptr<CSample> mySample2 = mySample; // 现在是两个引用指针。

  printf("The Sample now has %i references\n", mySample.use_count());

 

  // (C) 设置第一个指针为空。

  mySample.reset();

  printf("The Sample now has %i references\n", mySample2.use_count());  // 一个引用

 

  // 当mySample2离开作用域的时候,对象只有一个引用的时候自动被删除。

}

 在(A)中堆栈创建一个CSample的实例,并且一个shared_ptr指针指向这个实例

然后再给这个实例分配第二个指针,现在两个指针同时访问同一个数据

再将第一个指针制空,那么这个实例并没有被销毁,当mySample2退出它的作用域之外,CSample这个实例才被销毁。

4.重要特点:

 

  • shared_ptr<T>作用在一个未知类型上

当声明或定义一个shared_ptr<T>,T可能是一个未知的类型。例如你仅仅在前面声明了class T,但并没有定义class T。当我们要释放这个指针的时候我们需要知道这个T具体是一个声明类型。

  • shared_ptr<T>作用在任意类型上

在这里本质上不需要制定T的类型(如从一个基类继承下来的)

  • shared_ptr<T>支持自己定义释放对象的操作 

如果你的类中自己写了释放方法,也可以使用。具体参照Boost文档。

  • 强制转换 

如果你定义了一个U*能够强制转换到T*(因为T是U的基类),那么shared_ptr<U>也能够强制转换到shared_ptr<T>。

  • shared_ptr 是线程安全的 

(这种设计的选择超过它的优点,在多线程情况下是非常必要的)

  • 已经作为一种惯例,用在很多平台上,被证明和认同的。 

     

0 0