shared_ptr简介
写的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的新功能,如正则表达式等。
