C++ 智能指针 shared_ptr unique_ptr weak_ptr

来源:互联网 发布:ug nx11编程新功能 编辑:程序博客网 时间:2024/06/07 23:29
和普通指针区别:  能够自动释放所指向的对象shared_ptr  unique_ptr  weak_ptr

shared_ptr unique_ptr 常用方法

#include <iostream>using namespace std;int main(int argc, const char * argv[]){        shared_ptr<string>p1(new string("shared"));    shared_ptr<string>p2;    cout<<p1.use_count()<<endl;     //1    cout<<p2.use_count()<<endl;     //0    p2 = p1;    cout<<p1.use_count()<<endl;     //2    cout<<p2.use_count()<<endl;     //2        unique_ptr<string>p3(new string("unique"));    unique_ptr<string>p4(p3.release());         //释放对象所有权 不能使用直接赋值或拷贝    cout<<*p4<<endl;                //unique            return 0;}

weak_ptr 参考:http://www.cnblogs.com/TenosDoIt/p/3456704.html

一般用于shared_ptr 引起的循环引用(Objective-c 也有这种处理方法) 使用weak_ptr 来解决,使用weak_ptr引用计数不增加。 他需要shared_ptr来初始化,而且也不能通过他直接访问对象(有可能访问的对象已经被释放不存在了),可以通过weak_lock()来访问(他会检查访问的对象是否存在,并返回一个shared_ptr)。

class B;class A{public:        shared_ptr<B> pb_;        ~A()        {                cout<<"A delete\n";            }};        class B        {        public:                shared_ptr<A> pa_;                ~B()                {                        cout<<"B delete\n";                    }        };                void fun()        {                shared_ptr<B> pb(new B());                shared_ptr<A> pa(new A());                pb->pa_ = pa;                pa->pb_ = pb;                cout<<pb.use_count()<<endl;     //2                cout<<pa.use_count()<<endl;     //2        }                 int main()        {                fun();                            return 0;        }
此时引起循环引用,如果把A的shared_ptr<B> pb_; 改成weak_ptr<B> pb_; 就能解决此问题。

0 0
原创粉丝点击