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编译器)和静态分配对象的自定义删除程序(在这种情况下没有操作删除程序)