1 auto_ptr。智能指针销毁的时候自动delete所包含的指针。对象只能被一份智能指针持有。通过智能指针的复制构造函数会将前一个的指针置为null
使用方式如下:
class Person{
std::string name; public: Person() :name("kk"){ std::cout<<"construct Person"<<std::endl; } ~Person(){ std::cout<<"deconstruct Person"<<std::endl; } void show(){ std::cout<<"show person: " + name<<std::endl; } void show1(){ std::cout<<"show person" <<std::endl; } };auto_ptr<Person> ptr(new Person());
ptr->show();//ok ptr.get()->show();//okauto_ptr<Person> ptr1= ptr;
ptr1->show();//ok ptr->show();//错误。一旦通过ptr1= ptr复制后,智能指针包含的的指针即被清空变为null了(注意这个地方若是改为ptr->show1()则正常运行,因为未使用到this指针) ptr.get()为null 2 unique_ptr。取代了auto_ptr。实际上他禁止了智能指针的复制。解决了包含无效指针的对象。使用方式如下:
unique_ptr<Person> ptr(new Person());
ptr->show(); unique_ptr<Person> ptr1 = ptr;//错误,无法复制3 shared_ptr。利用引用计数的原则对指针进行管理。他无法解决2个对象的环状引用,比如A对象包含B对象的智能指针,B包含A的智能指针。
使用方式如下:
shared_ptr<Person> s_ptr(new Person()); s_ptr->show(); long count = s_ptr.use_count();//获取引用计数,为1 cout<<count<<endl; shared_ptr<Person> s_ptr1 = s_ptr; s_ptr1->show(); count = s_ptr.use_count();// 引用计数为2 cout<<count<<endl; s_ptr1.reset();//清除所持有的指针,引用计数减一 引用计数count,存放在shared_ptr第一次使用时分配的数据__cntrl_(new出的对象)里面,在以后的shared_ptr的复制中,也会传递__cntrl_,以达到共享引用计数的目的。
4 weak_ptr。正因为shared_ptr无法解决环状引用,所以出现了weak_ptr,他配合shared_ptr使用,用于判断shared_ptr智能指针包含的对象是否被释放。他本身不会增减对象使用次数。
使用方式如下:
shared_ptr<Person> sp(new Person());
std::cout<<sp.use_count()<<std::endl;weak_ptr<Person> wp(sp);//引用计数不增加
wp->show();//错误,不具有指针行为 std::cout<<sp.use_count()<<std::endl; if(!wp.expired()){ shared_ptr<Person> sp2 = wp.lock();//获取一个shared_ptr,引用计数增加 sp2->show(); std::cout<<wp.use_count()<<std::endl; } std::cout<<wp.use_count()<<std::endl;//sp2销毁,引用计数减少 sp.reset(); std::cout<<wp.expired()<<std::endl;//true,已经过期,指向的shared_ptr已经不持有指针 std::cout<<wp.lock()<<std::endl;//无法获得shared_ptr