標準庫和boost庫中幾個智慧指標的比較
阿新 • • 發佈:2019-02-19
這些智慧指標在設計的時候,一個關鍵的問題就是所有權的控制。如果把指標所指向的物件比作電視機的話,那麼指標就是觀眾。第一個人需要看電視的時候需要開啟它,沒人看的時候就要保證把電視關掉。對於std::auto_ptr,boost::shared_ptr和scoped_ptr,情況如下:
1. std::auto_ptr:auto_ptr這個種族很有趣,每次只讓一個人看電視,大家可以換著看,由最後那個不想看的人關掉。當把一個auto_ptr賦值給另一個時,就好比換一個人看電視似的。總之,電視只能一個人看,第二個人想看第一個就得讓位。
2. boost::shared_ptr:這個種族就很大方了,有好節目大家一起看:)只要最後一個看電視的人走的時候關掉就好了。看電視的每個人都知道當時有多少人在看,所以最後一個人知道自己的確是最後一個人。
3. boost::scoped_ptr:這是最自私的種族,每個電視只能讓一個人看,別人門都沒有。所以你不要試圖去複製一個scoped_ptr物件。自己的電視自己處理,為了省電自己也得關吧,的確很安全:)
所以,auto_ptr的機理就是複製時轉移所有權,也就是所指的物件永遠最多為一個auto_ptr物件所有,這樣就能保證物件能安全的釋放。shared_ptr基於引用計數,當把一個shared_ptr賦給另一個時,引用計數加一,當一個shared_ptr析構時,引用計數減一,當減為零時釋放物件。而scoped_ptr不允許複製,所以自始至終物件由唯一的scoped_ptr建立,維護並釋放。
1. std::auto_ptr:auto_ptr這個種族很有趣,每次只讓一個人看電視,大家可以換著看,由最後那個不想看的人關掉。當把一個auto_ptr賦值給另一個時,就好比換一個人看電視似的。總之,電視只能一個人看,第二個人想看第一個就得讓位。
2. boost::shared_ptr:這個種族就很大方了,有好節目大家一起看:)只要最後一個看電視的人走的時候關掉就好了。看電視的每個人都知道當時有多少人在看,所以最後一個人知道自己的確是最後一個人。
3. boost::scoped_ptr:這是最自私的種族,每個電視只能讓一個人看,別人門都沒有。所以你不要試圖去複製一個scoped_ptr物件。自己的電視自己處理,為了省電自己也得關吧,的確很安全:)
所以,auto_ptr的機理就是複製時轉移所有權,也就是所指的物件永遠最多為一個auto_ptr物件所有,這樣就能保證物件能安全的釋放。shared_ptr基於引用計數,當把一個shared_ptr賦給另一個時,引用計數加一,當一個shared_ptr析構時,引用計數減一,當減為零時釋放物件。而scoped_ptr不允許複製,所以自始至終物件由唯一的scoped_ptr建立,維護並釋放。