Luk*_*keN 0 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 *t)
{
_values.push_back(t);
}
Run Code Online (Sandbox Code Playgroud)
这一切都很有趣和花花公子,适用于派生类的堆栈和堆分配对象Tag.
当然,如果提供给的指针TagCompound::insert()是在堆上分配的,那么它必须在外面的某处解除分配.这意味着从向量中删除某些内容的每个方法都必须返回已删除的指针,以便外部可以再次释放它,如果必须的话.
我不喜欢这个,如果调用者忘了它,它会很麻烦并且容易出错delete.
我尝试的另一件事就是假设向量中的每个指针_values都是堆分配的,并且在每个以某种方式删除了某些东西的函数中进行删除,_values并delete在其中的每个剩余元素上运行TagCompound::~TagCompound.
这当然通过导致无效删除完全排除了堆栈指针.
我也试过使用std::auto_ptr但很快我发现它不适用于STL容器.可能有一些来自boost,但我不想使用boost(或任何类型的第三方库).
我是否已经采用其中一种方法正确的方式,或者是否有某种黑魔法效果更好?
您可以使用tr1 :: shared_ptr(如果您有一个0x编译器,则为std :: shared_ptr)和静态分配对象的自定义删除(在这种情况下为no-op deleters).