即便通過(guò)上述策略2把兩次delete同一對(duì)象空間的錯(cuò)誤搞定了,但是萬(wàn)一程序又使用了先前的,已經(jīng)沒(méi)有對(duì)象空間所有權(quán)的智能指針,還會(huì)引起未定義行為,因?yàn)樗赶蛄艘粋€(gè)非法數(shù)據(jù)。當(dāng)然這是針對(duì)auto_ptr而言的。
對(duì)于unique_ptr而言,它就好像是引用,它只能指向某一特定對(duì)象,它一旦指向某一對(duì)象別的unique_ptr就無(wú)法再指向該對(duì)象了,從而避免了兩次delete和使用無(wú)效智能指針的錯(cuò)誤。
Unique_ptr不允許兩個(gè)同作用域,同生存期的指針互相賦值,但是它允許把一個(gè)臨時(shí)性的unique_ptr指針賦給一個(gè)非臨時(shí)性的unique_ptr指針。我想這也是為了保證只有一個(gè)unique_ptr指針能指向某一特定對(duì)象吧,因?yàn)榕R時(shí)性的unique_ptr使完了就沒(méi)了,它不會(huì)干擾干擾外部作用域的unique_ptr指針。至于說(shuō)這對(duì)于容器有好處,我還真沒(méi)想到具體好處是啥。
兩個(gè)同作用域同生存期的unique_ptr指針互相賦值可以使用move函數(shù),如下圖所示:
此外,unique_ptr還可以用于數(shù)組空間的分配,它會(huì)自動(dòng)調(diào)用delete[]進(jìn)行空間的釋放,如下圖所示:
在使用new進(jìn)行空間分配時(shí),你可以使用auto_ptr和shared_ptr,但是它倆不能用于new[]。
針對(duì)不使用new分配的空間,你也不能使用auto_ptr、shared_ptr和unique_ptr。
針對(duì)不使用new和new[]的情況,你不可以使用unique_ptr。