支持引用計數的智能指針類模板

智能指針算是很多人喜歡思考的一種內存管理方案了...雖然這種方案本身存在一些硬傷,但是在很多需要智能,且使用方式相對較簡單的場合裏應用還是比較多的.

先發一個我最初寫好的版本:

使用示例:

以上的智能指針類解決了包括指針多次複製導致的析構刪除錯誤等問題,利用一個靜態的管理類紀錄了所有當前存在的指針,每次添加新指針時就在靜態指針map中登記,若當前指針已存在就將對應的引用計數加1...

不過使用這種方法管理引用計數有一個很大的缺點,就是每次添加或刪除指針時必須要查找指針map,效率上會有所損失.但是這樣做的好處是不會因爲將普通指針賦值給智能指針而導致引用計數的管理混亂.

通常智能指針的解決方案是封裝一個用於計數的指針封裝類,在智能指針類創建新智能指針時new一個新的計數類並保存它的指針,當出現智能指針之間的拷貝時通過自己保存的計數類指針對計數進行操作,等同於操作了所有擁有這個計數類指針的智能指針的引用計數.這樣做就不需要任何查表的操作了,但是不好的地方是一個指針引用計數類的實例並沒有嚴格的與一個指針相綁定...但是隻要嚴格注意使用規範(比如不要使用普通指針直接構造智能指針,在構造新智能指針時一定要使用new出來的新指針),是不會出現指針計數管理出現混亂的錯誤的.

在實際使用中,我還發現上面的代碼還有因指針型別不同導致指針轉換不方便,以及當使用類指針時此智能指針析構函數不會調用其析構函數等一些問題.

下面是一個改進版的TSmartPtr:

現在的智能指針不再使用map存儲指針表了,另外加上了指針型別不同的拷貝,轉換支持.其使用方法沒有很大的變化,但是要注意一定不能這樣使用:

而原來的代碼版本即使這樣使用也不會出問題.

以上代碼在Microsoft Visual C++ 2005上編譯通過.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章