我坐在这里与下面的课程:
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()
的指针是在堆上分配的,那么它必须在外面的某处解除分配。这意味着从向量中删除某些内容的每个方法都必须返回已删除的指针,以便外部可以再次释放它,如果必须的话。
我不喜欢这样,如果来电者忘记了delete
,那就太乱了,容易出错。
我尝试过的另一件事就是假设向量_values
中的每个指针都将被堆分配,并在每个以某种方式从_values
删除某些内容的函数中删除并在delete
中的每个剩余元素上运行TagCompound::~TagCompound
。
当然,这会通过导致无效删除来完全排除堆栈指针。
我也尝试使用std::auto_ptr
,但很快我发现它不适用于STL容器。可能有一些来自提升,但我不想使用boost(或任何类型的第三方库)。
我是否已经采用其中一种方法正确的方法,或者是否有某种黑魔法效果更好?
答案 0 :(得分:5)
你可以使用tr1 :: shared_ptr(或std :: shared_ptr,如果你有一个0x编译器)和自定义删除器用于静态分配的对象(在这种情况下是无操作删除器)。
答案 1 :(得分:3)
一种解决方案是要求动态分配对象,其生命周期由 shared_ptr<Tag>
管理。
您可以使用Boost库中的boost::shared_ptr
(即将推出的c ++ 0x标准中也有std::shared_ptr
。)
然后你有一个shared_ptr
的向量,让那些shared_ptr
自动管理生命时间。当Tag
对象的最后一个shared_ptr
引用消失时,它将自动销毁。而不是之前。
干杯&amp;第h。,