2012-01-19 117 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中没有这样的选项。