C++11新特性之智能指针(shared_ptr/unique_ptr/weak_ptr)

2020-01-06 15:41:13王振洲

weak_ptr

weak_ptr一般和shared_ptr配合使用。它可以指向shared_ptr所指向的对象,但是却不增加对象的引用计数。这样就有可能出现weak_ptr所指向的对象实际上已经被释放了的情况。因此,weak_ptr有一个lock函数,尝试取回一个指向对象的shared_ptr。


cout<<"test weak_ptr basic usage:"<<endl;
auto p10 = make_shared<int>(1024);
weak_ptr<int> wp1(p10);
cout<<"p10 use_count: "<<p10.use_count()<<endl;
//p10.reset(new int(1025)); // this will cause wp1.lock() return a false obj
shared_ptr<int> p11 = wp1.lock();
if(p11) cout<<"wp1: "<<*p11<<" use count: "<<p11.use_count()<<endl;

总结

shared_ptr采用引用计数的方式管理所指向的对象。
shared_ptr可以使用一个new表达式返回的指针进行初始化;但是,不能将一个new表达式返回的指针赋值给shared_ptr。
一旦将一个new表达式返回的指针交由shared_ptr管理之后,就不要再通过普通指针访问这块内存。
shared_ptr可以通过reset方法重置指向另一个对象,此时原对象的引用计数减一。
可以定制一个deleter函数,用于在shared_ptr释放对象时调用。
unique_ptr对于所指向的对象,是独占的。
不可以对unique_ptr进行拷贝、赋值等操作,但是可以通过release函数在unique_ptr之间转移控制权。
unique_ptr可以作为函数的返回值和参数使用。
unique_ptr同样可以设置deleter,需要在模板参数中指定deleter的类型。
weak_ptr一般和shared_ptr配合使用。它可以指向shared_ptr所指向的对象,但是却不增加对象的引用计数。
weak_ptr有一个lock函数,尝试取回一个指向对象的shared_ptr。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持ASPKU。


注:相关教程知识阅读请移步到C++教程频道。