概述
智能指針主要用于管理在堆上分配的內(nèi)存瓶盛,它將普通的指針?lè)庋b為一個(gè)棧對(duì)象。當(dāng)棧對(duì)象的生存周期結(jié)束后示罗,會(huì)在析構(gòu)函數(shù)中釋放掉申請(qǐng)的內(nèi)存惩猫,從而防止內(nèi)存泄漏。
C++里面的四個(gè)智能指針: auto_ptr, unique_ptr,shared_ptr, weak_ptr蚜点,其中后三個(gè)是C++11支持轧房,并且第一個(gè)已經(jīng)被C++11棄用。
原理
智能指針的作用是管理一個(gè)指針绍绘,因?yàn)榇嬖谝韵逻@種情況:申請(qǐng)的空間在函數(shù)結(jié)束時(shí)忘記釋放奶镶,造成內(nèi)存泄漏迟赃。使用智能指針可以很大程度上的避免這個(gè)問(wèn)題,因?yàn)橹悄苤羔樉褪且粋€(gè)類厂镇,當(dāng)超出了類的作用域是纤壁,類會(huì)自動(dòng)調(diào)用析構(gòu)函數(shù),析構(gòu)函數(shù)會(huì)自動(dòng)釋放資源捺信。所以智能指針的作用原理就是在函數(shù)結(jié)束時(shí)自動(dòng)釋放內(nèi)存空間酌媒,不需要手動(dòng)釋放內(nèi)存空間。
技術(shù)細(xì)節(jié)及使用方法
1.auto_ptr
所有權(quán)模式残黑,C++11中已經(jīng)廢棄
2.unique_ptr
unique_ptr實(shí)現(xiàn)獨(dú)占式擁有或嚴(yán)格擁有概念馍佑,保證同一時(shí)間內(nèi)只有一個(gè)智能指針可以指向該對(duì)象。它對(duì)于避免資源泄露特別有用梨水。
unique_ptr<int> p1(new int(1)); //初始化方式1拭荤,注意類的構(gòu)造函數(shù)初始化方式
unique_ptr<int> p2,p3;
p2 = unique_ptr<int>(new int(3)); //初始化方式2,注意這里用來(lái)初始化時(shí)使用的unique_ptr只是一個(gè)臨時(shí)右值疫诽,初始化完就沒(méi)有歸屬了舅世,可以這么用
p3 = move(p2); //初始化方式3,將另一個(gè)unique_ptr的所有權(quán)轉(zhuǎn)讓給當(dāng)前unique_ptr
p2 = unique_ptr<int>(new int(5)); //如果這里不再次初始化p2,后面不能訪問(wèn)p2奇徒,因?yàn)閜2是空指針了
cout<<*p1<<*p2<<*p3<<endl; //輸出153
3.shared_ptr
shared_ptr實(shí)現(xiàn)共享式擁有概念雏亚。多個(gè)智能指針可以指向相同對(duì)象,該對(duì)象和其相關(guān)資源會(huì)在“最后一個(gè)引用被銷毀”時(shí)候釋放摩钙。從名字share就可以看出了資源可以被多個(gè)指針共享罢低,它使用計(jì)數(shù)機(jī)制來(lái)表明資源被幾個(gè)指針共享∨值眩可以通過(guò)成員函數(shù)use_count()來(lái)查看資源的所有者個(gè)數(shù)网持。除了可以通過(guò)new來(lái)構(gòu)造,還可以通過(guò)傳入auto_ptr, unique_ptr,weak_ptr來(lái)構(gòu)造长踊。當(dāng)我們調(diào)用release()時(shí)功舀,當(dāng)前指針會(huì)釋放資源所有權(quán),計(jì)數(shù)減一身弊。當(dāng)計(jì)數(shù)等于0時(shí)辟汰,資源會(huì)被釋放。
shared_ptr 是為了解決 auto_ptr 在對(duì)象所有權(quán)上的局限性(auto_ptr 是獨(dú)占的), 在使用引用計(jì)數(shù)的機(jī)制上提供了可以共享所有權(quán)的智能指針阱佛。