1 auto_ptr。智能指針銷燬的時候自動delete所包含的指針。對象只能被一份智能指針持有。經過智能指針的複製構造函數會將前一個的指針置爲null函數
使用方式以下:this
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();//ok對象
auto_ptr<Person> ptr1= ptr;
ptr1->show();//ok
ptr->show();//錯誤。一旦經過ptr1= ptr複製後,智能指針包含的的指針即被清空變爲null了(注意這個地方如果改成ptr->show1()則正常運行,由於未使用到this指針)
ptr.get()爲nullget
2 unique_ptr。取代了auto_ptr。實際上他禁止了智能指針的複製。解決了包含無效指針的對象。string
使用方式以下:class
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