2012-03-25 152 views
1

我想在我的C++項目自動記憶處置。自動C++內存/對象實例管理?聰明的指針?

我不介意有一些額外的約定,以獲得該內存自動處理 - 具體而言,我不介意對創建新的對象實例一些特殊的編碼(當然,沒有什麼更多因爲它擊敗了目的)。

在計算器許多有益的討論一些讀數之後,我發現「智能指針」被稱爲最(與第三方C++垃圾收集器的一些參考一起)。

隨着裝備只有一些「教科書」 C++知識,我相信C++的GC的複雜性使他們不值得使用,在我的情況。

在另一方面,我有一個.NET/Java的背景下,想利用在C++太這方面的經驗。我習慣於創建對象實例,並將它們傳遞給其他類/功能(我相信這是一些C的麪包和奶油的東西++太)。

那麼,智能指針/ shared_ptr /提高我在找什麼?

(注意,記憶獲取我的意思是做一個MyClass* var = new MyClass(),不malloc()。)

一些具體背景:

其實我正是我試圖做的是寫一些庫功能,這可以用於C++項目和iPhone項目(請注意,這些是純邏輯業務類,因此不應存在可移植性問題)。雖然我相信這不是一個需要高性能的區域(iPhone的非遊戲應用程序),但我對資源使用情況有一些擔憂。

在這種情況下使用智能指針有什麼問題嗎?有沒有更好的選擇?

回答

0

考慮引用計數?創建一個基類,用於保存引用次數的計數,並在引用計數爲零時刪除自身。

class RefCounter 
{ 
    public: 
     RefCounter() : mRefCount(1) { } 
     virtual ~RefCounter() { } 

     void retain() { mRefCounter++; } 
     void release() { 
      if(mRefCount) mRefCount--; 
      if(!mRefCount) delete this; 
     } 

    protected: 
     unsigned int mRefCounter; 
}; 

任何需要該實例的引用對象都會調用它的retain()函數,並在完成後調用release()。最後一個調用release的對象會導致實例刪除它自己。您必須小心平衡保留和釋放,但這種技術基本上是GC的工作原理,只是GC實現隱藏了這個引用。

我學會了C++之前自動GC成爲所有的憤怒,我從來沒有真正回暖的概念,感覺更安全的確切地知道何時何地的每個內存字節被分配和釋放。但那只是我。

+0

不就是如何shared_ptr的作品?你確定這樣做有很多性能優勢嗎? – kossmoboleat 2012-03-25 14:33:18