2012-01-19 175 views
-1

以下是我怎麼可能有某種形式的自動內存管理C++中的草圖:C內存管理

template<class T> 
class Ptr{ 
public: 
    /* Some memory management stuff (ref counting etc.) 
    as Ptr object is initialized */ 
    Ptr(...) { .. } 

    /* Manage reference counts etc. 
    as Ptr object is copied -- might be necessary 
    when Ptr is passed to or returned from functions */ 
    Ptr<T>& operator=(..) { .. }; 

    /* Do memory management stuff 
     when this "Pointer" object is destroyed. */ 
    ~Ptr() { .. } 

private: 
    /* Pointer to main object */ 
    T* object; 
} 

class Obj{ 
public: 
    static Ptr<Obj> newObj(..) { return Ptr<Obj>(new Obj(..)); } 
private: 
    /* Hide constructor so it can only be created by newObj */ 
    Obj(..) { .. } 
    /* some variables for memory management routines */ 
    int refcnt; 
    .. 
} 

這樣,最終用戶從來沒有打電話給新的或malloc的,而是可以調用Obj.newObj(..)。

不過,我敢對我怎麼可能會做同樣的事情爲C.

難倒

它不必完全像上面,但我不想去關心內存管理這並不重要。

我覺得我遇到的最大問題是,當C中的變量超出範圍時,我沒有真正的'析構函數'可以發信號通知我該變量已超出範圍。

+5

你爲什麼要創建自己的智能指針? – delnan

+4

如果你想要智能指針,你不應該使用C. – Pubby

回答

1

要獲得完整的解決方案並回答您的問題,請參閱GObject

+0

你能解釋一下GObject如何解決手動內存管理的問題嗎?您鏈接到的維基百科頁面沒有說清楚。 –

+0

你能解釋一下你的意思是什麼「手動」管理? –

+0

我的意思是問題中所描述的內容:「它不必與上面完全相同,但是*當它不重要時,我不想在意內存管理。」 (重點是我的)。 –

2

是的,這是C++的主要優點。您可以創建封裝功能的類。此功能可以包含構造函數和析構函數,以確保數據以受控方式創建,管理和銷燬。

除非您實現支持這種選項的整個框架,否則C中沒有這樣的選項。