2011-02-03 59 views
0

我坐在这里,下面的类问题:关于对象的生命周期和回收责任

class TagCompound : public Tag 
{ 
    public: 
     // [...] Constructor and other methods 
     void insert(Tag *t); 
     // [...] more modifying methods 

    protected: 
     std::vector<Tag *> _values; 
}; 

TagCompound::insert(Tag *t) 
{ 
    _values.push_back(t); 
} 

这是所有的乐趣和花花公子,并与衍生的Tag一类的堆栈和堆分配对象的工作。

当然,如果提供给TagCompound::insert()的指针在堆上分配,它必须在外部的某个位置释放。这意味着每个从vector中删除某些东西的方法都必须返回已删除的指针,以便外部可以再次释放它,如果必须的话。

我不喜欢这样,如果调用者忘记delete它会很麻烦和容易出错。

我尝试了简单地假定每指针在矢量_values将堆中分配和执行的缺失在每一个某种方式从_values删除一些功能,并具有delete运行的每个其余部件在TagCompound::~TagCompound其他的事情。

这当然完全排除堆栈指针造成无效删除。

我也试过使用std::auto_ptr但很快我发现它不适用于STL容器。可能有些提升,但我不想使用增强(或任何类型的第三方库)。

我是否已经用这些方法之一的正确方式,或者是否有某种黑魔法运作得更好?

回答

5

(如果你有一个0X编译或std :: shared_ptr的),您可以使用TR1 :: shared_ptr的与静态分配的对象(无操作在这种情况下删除器)的自定义删除器。

3

一个解决方案是要求动态分配对象,其生命周期由shared_ptr<Tag>管理。

您可以使用Boost库中的boost::shared_ptr(在即将推出的C++ 0x标准中也有std::shared_ptr)。

然后你有一个向量shared_ptr s,让这些shared_ptr自动管理生命时间。当最后的shared_ptr引用消失时,Tag对象将自动销毁。而不是之前。

干杯&心连心,