1.对std::auto_ptr进行复制,原来的指针会失效
std::auto_ptr<Widget> p;
std::auto_ptr<Widget> wptr(new Widget());
p = wptr; // wptr指向失效
p->print();
wptr->print(); // 错误
2.boost::scoped_ptr不能拷贝
{
boost::scoped_ptr<Widget> wptr(new Widget());
wptr->print();
boost::scoped_ptr<Widget> wptr2 = wptr; // 编译器出错
}
3.boost::scoped_array管理动态数组
std::auto_ptr和boost::scoped_ptr都不能管理动态分配的数组
{
// 这里调用构造三次,析构三次
boost::scoped_array<Widget> wptr(new Widget[3]);
}
4.boost::shared_ptr真正的智能指针,可以拷贝,作为STL容器成员
在容器销毁后,会自动销毁vector中所有智能指针所指向的对象
{
typedef boost::shared_ptr<Widget> WidgetPtr;
WidgetPtr p1(new Widget());
WidgetPtr p2(new Widget());
std::vector<WidgetPtr> vp;
vp.push_back(p1);
vp.push_back(p2);
}
5.boost::shared_array管理动态数组
{
boost::shared_array<Widget> arrayPtr(new Widget[3]);
arrayPtr[0].print();
}
6.boost::weak_ptr是一个特殊的指针(不增加也不减少引用计数),它是boost::shared_ptr的一个辅助类
{
boost::shared_ptr<Widget> ptr1(new Widget());
boost::shared_ptr<Widget> ptr2 = ptr1;
boost::weak_ptr<Widget> ptr3(ptr2);
std::cout << ptr3.use_count() << std::endl; // 得出智能指针的引用计数
boost::shared_ptr<Widget> ptr4 = ptr3.lock(); // 返回一个智能指针
std::cout << ptr3.use_count() << std::endl;
}
7.使用boost::shared_ptr的时候尤其要注意循环引用的问题,boost::weak_ptr可以解决。
class Widget
{
public:
Widget() { std::cout << "Widget" << std::endl; }
~Widget() { std::cout << "~Widget" << std::endl; }
void print() { std::cout << "Print" << std::endl; }
boost::shared_ptr<Widget> ptr_; // 改为boost::weak_ptr<Widget> ptr_;
};
// 这里存在循环引用问题,所以资源是释放不掉的,应该将Widget中的boost::shared_ptr改为boost::weak_ptr
{
boost::shared_ptr<Widget> ptr(new Widget());
ptr->ptr_ = ptr;
}
7.如果是owner类持有child类,child类也持有owner类造成的循环引用,通常解决方法是:owner持有指向的child的shared_ptr,child持有指向owner的weak_ptr。