十六、C++14標(biāo)準(zhǔn)和智能指針

本章介紹C++14的新特性并介紹一下C++11之前之后的智能指針。其實(shí)C++14標(biāo)準(zhǔn)相比C++11標(biāo)準(zhǔn)就新增了一些自動推導(dǎo)的特性,比如lambda表達(dá)式參數(shù)類型推導(dǎo)、函數(shù)返回類型自動推導(dǎo);以及新增了lambda表達(dá)式的初始化捕獲。

lambda表達(dá)式參數(shù)類型推導(dǎo)
出現(xiàn)輸入較為麻煩的類型不需要再換名,直接寫成auto。例如:

函數(shù)返回類型推導(dǎo)
更改返回值類型時(shí),不再需要每次更改函數(shù)的返回類型。例如:

lambda表達(dá)式的初始化捕獲
相當(dāng)于間接傳值,避免直接傳值,并且該間接值不需要初始化。例如:

C++11之前的智能指針
C++11之前的智能指針是auto_ptr,一開始它的出現(xiàn)是為了解決指針沒有釋放導(dǎo)致的內(nèi)存泄漏。比如忘了釋放或者在釋放之前,程序throw出錯(cuò)誤,導(dǎo)致沒有釋放。所以auto_ptr在這個(gè)對象聲明周期結(jié)束之后,自動調(diào)用其析構(gòu)函數(shù)釋放掉內(nèi)存。
以上3句中,只有第3句是符合規(guī)范的。因?yàn)槠涫鞘褂胣ew定義的,會存在于堆中,而堆是允許進(jìn)行內(nèi)存操作的。而1、2句綁定在非堆的變量上,這樣在釋放時(shí)極容易出現(xiàn)錯(cuò)誤。所以千萬不要用一塊非new分配的動態(tài)內(nèi)存去初始化一個(gè)智能指針。也需要注意,auto_ptr不能夠作為函數(shù)的返回值和函數(shù)的參數(shù),也不能在容器中保存autp_ptr,導(dǎo)致使用不便。

C++11之后的智能指針
C++11之后智能指針分為了三種:shared_ptr、unique_ptr、weak_ptr。而weak_ptr相當(dāng)于shared_ptr的一個(gè)輔助指針, 所以正式的智能指針只有shared_ptr和unique_ptr。
具體用法和說明見https://blog.csdn.net/haolexiao/article/details/56773039?%3E。(我偷偷懶[]~( ̄▽ ̄)~*)