gpt4 book ai didi

c++ - 关于对象生命周期和释放责任的问题

转载 作者:太空宇宙 更新时间:2023-11-04 15:09:30 28 4
gpt4 key购买 nike

我和下面的类(class)坐在一起:

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,它会很困惑而且容易出错

我尝试的另一件事是简单地假设 vector _values 中的每个 指针将分配堆并在每个以某种方式从 _values 中删除某些内容的函数中执行删除操作并且有deleteTagCompound::~TagCompound 中的每个剩余元素上运行.

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

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

我是否已经使用其中一种方法走上了正确的道路,或者是否有某种更有效的黑魔法?

最佳答案

您可以将 tr1::shared_ptr(或 std::shared_ptr,如果您有 0x 编译器)与自定义删除器一起用于静态分配的对象(在本例中为无操作删除器)。

关于c++ - 关于对象生命周期和释放责任的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4890408/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com