weak_ptr,shared_ptr,scoped_ptr|| scoped_ptr是不能和 weak_ptr,shared_ptr進(jìn)行轉(zhuǎn)換的,因?yàn)闆]有相應(yīng)的轉(zhuǎn)換函數(shù)! 所以他是孤立,這點(diǎn)從他的名字上也可以見到。scope:作用地域,領(lǐng)域。來開了就沒有了。同時(shí)在領(lǐng)域內(nèi)所有權(quán)又獨(dú)占!! shared_ptr:可以把weak_ptr轉(zhuǎn)化成(賦值給)shared_ptr:而且這種賦值不會(huì)導(dǎo)致weak_ptr的引用計(jì)數(shù)增加。 而僅僅是把weak_ptr的引用計(jì)數(shù)賦給shared_ptr的引用計(jì)數(shù)。 也可以把shared_ptr轉(zhuǎn)化成(賦值給)weak_ptr。而且這種賦值不會(huì)導(dǎo)致shared_ptr的引用計(jì)數(shù)增加。 而僅僅是把shared_ptr的引用計(jì)數(shù)賦給weak_ptr的引用計(jì)數(shù)。 shared_ptr<int> pi1(new int910)); int *p1=pi1.get(); pi1=p1;//error.. weak_ptr<int> wp=weak_ptr<int>( pi1.get() ); pi1 = wp;//ok 認(rèn)識(shí)weak_ptr的好方法就是認(rèn)為 他和一般的指針沒有區(qū)別,還有就是他沒有刪除它能訪問的動(dòng)態(tài)分配的空間的能力。它存在的目的是 他讓 pi1 = wp;//ok 可以進(jìn)行。 因?yàn)樵谥悄苤羔橆I(lǐng)域內(nèi): 智能指針<Type> 指向Type的智能指針對(duì)象 ; Type * p= new Type; 指向Type的智能指針對(duì)象 = p 是錯(cuò)誤的! 綜上:shared_ptr ,和 weak_ptr對(duì)象可以互相賦值。scoped_ptr是孤立的! weak_ptr無權(quán)釋放他能訪問的動(dòng)態(tài)分配的空間。 所以: main(){ weak_ptr<int> wp(new int(10) );}將會(huì)導(dǎo)致內(nèi)存泄露 main() { weak_ptr<int> wp(new int(10) ); shared_ptr<int> sp=wp;//不會(huì)改變引用計(jì)數(shù) }//不會(huì)有內(nèi)存泄露 //關(guān)于什么情況下轉(zhuǎn)換可以進(jìn)行可以參看boot源代碼。 |
|