C++ 关于对象生存期和解除分配责任的问题

C++ 关于对象生存期和解除分配责任的问题,c++,memory-management,C++,Memory Management,我和下面的同学坐在一起: class TagCompound : public Tag { public: // [...] Constructor and other methods void insert(Tag *t); // [...] more modifying methods protected: std::vector<Tag *> _values; }; TagCompound::insert(Tag

我和下面的同学坐在一起:

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);
}
class标记化合物:公共标记
{
公众:
//[…]构造函数和其他方法
空白插入物(标签*t);
//[…]更多修改方法
受保护的:
std::向量_值;
};
标记化合物::插入(标记*t)
{
_值。推回(t);
}
这一切都很有趣,并且可以处理
标记
派生的类的堆栈和堆分配对象

当然,如果提供给
tagcomponent::insert()
的指针是在堆上分配的,那么它必须被释放到堆外的某个地方。这意味着每个从向量中移除某些内容的方法都必须返回移除的指针,以便外部可以在必要时再次释放它

我不喜欢这样,如果打电话的人忘记删除它,这会很混乱,而且容易出错

我尝试过的另一件事是简单地假设向量
\u values
中的每个指针都是堆分配的,并在每个函数中执行删除操作,这些函数以某种方式从
\u values
中删除了一些内容,并在
tagcomponent::~tagcomponent
中的每个剩余元素上运行
delete

这当然会导致无效的删除,从而完全排除堆栈指针

我还尝试过使用std::auto_ptr,但很快我发现它不适用于STL容器。可能有来自boost的东西,但我不想使用boost(或任何第三方库)


我使用这些方法中的一种已经走上了正确的道路,还是有某种黑魔法效果更好?

一种解决方案是要求动态分配对象,生命周期由
共享\u ptr
管理

您可以使用boost库中的
boost::shared_ptr
(在即将推出的c++0x标准中还有一个
std::shared_ptr

然后你有一个向量
shared\u ptr
s,让那些
shared\u ptr
自动管理生命周期。当最后一个
共享的\u ptr
引用消失时,
标记
对象将自动销毁。而不是以前


Cheers&hth.,

您可以使用tr1::shared_ptr(或std::shared_ptr,如果您有0x编译器)和静态分配对象的自定义删除程序(在这种情况下没有操作删除程序)