shared_ptr简介

2008年11月17日 | 分类: C/C++ | 标签: ,

写的code不够多,知识面确实相当缺乏,若不是VS2008开始支持TR1,真不知道有个shared_ptr,只知道有个auto_ptr,翻了下Google,发现早在两年前(甚至更早)shared_ptr就已经在TR1和Boost里面了。

  shared_ptr有何本事?简单说就是用来管理被共享的资源的,举个例子:

#include <iostream>
#include <memory>
 
class B
{
public:
  B() { std::cout << "构造" << std::endl; }
  ~B() { std::cout << "析构" << std::endl; }
};
 
class A
{
  B *p;
public:
  A(B *init) : p(init) {}
};
 
void testptr()
{
  B *lp = new B();
  A a1(lp);
  A a2(lp);
  //delete lp;
}
 
int main()
{
  testptr();
 
  system("pause");
  return 0;
}

这里a1和a2共享了一个资源lp,而lp是用new动态分配的,必须显示的调用delete删除,但是该在哪删除?由谁来删除?删除后怎么通知a1和a2?解决这些问题必须自己另行设计。
如果使用shared_ptr,一切将变得简单。shared_ptr内部维护一个表示它所管理的资源的引用计数,当shared_ptr被创建时引用计数加1,被销毁时减1,当减到0的时候shared_ptr将自动调用delete删除它所管理的资源:

#include <iostream>
#include <memory>
 
class B
{
public:
  B() { std::cout << "构造" << std::endl; }
  ~B() { std::cout << "析构" << std::endl; }
};
 
class A
{
  std::tr1::shared_ptr<B> p;
public:
  A(std::tr1::shared_ptr<B> init) : p(init) {}
};
 
void testptr()
{
  std::tr1::shared_ptr<B> lp(new B());
  A a1(lp);
  A a2(lp);
}
 
int main()
{
  testptr();
 
  system("pause");
  return 0;
}

这里有3个shared_ptr:lp、a1.p、a2.p,当执行完A a2(lp)这句时,lp、a1.p、a2.p的引用计数都为3,当执行完testptr()函数后,3个shared_ptr被依次销毁,引用计数依次减1,当减到0时,最后一个被销毁的shared_ptr将自动调用delete删除它所管理的共享资源B。
可以看到shared_ptr十分强大方便,这只是个简单的例子,shared_ptr还可以自定义删除方法,还有个配套使用的weak_ptr,具体还是参考MSDN吧。
有一点遗憾就是shared_ptr的析构函数是调用delete而不是delete []来删除资源,这意味着用shared_ptr来管理数组是个馊主意:

std::tr1::shared_ptr<int> lp(new int[5]);

更无奈的是居然可以正常编译。TR1里没有管理数组的智能指针,Boost里有,叫shared_array。

顺便介绍本书,中文名叫《C++标准库扩展权威指南》,中文版纸质很差,网上有英文版的chm,叫《The C++ Standard Library Extensions》,里面详细介绍了TR1的新功能,如正则表达式等。

1 trackbacks

  1. StarsunYzL » weak_ptr简介 Pingback | 2009/11/16