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。