从内存中删除对象

C++ Deleting objects from memory

本文关键字:对象 删除 内存      更新时间:2023-10-16

假设我已经分配了一些内存,并将其填充为一组相同类型的对象,我们将这些对象称为组件。

假设其中一个组件需要删除,那么有什么好方法可以让组件创建的"漏洞"可以被测试,并通过循环迭代一组对象来跳过?

反过来也应该成立,我希望能够测试一个洞,以便在空间中存储新的组件。

我在想核&

boost::optional<component>似乎完全符合您的需求。把这些放进你的储藏室,不管那是什么。例如,使用std::vector

// initialize the vector with 100 non-components
std::vector<boost::optional<component>> components(100);
// adding a component at position 15
components[15].reset(component(x,y,z));
// deleting a component at position 82
componetnts[82].reset()
// looping through and checking for existence
for (auto& opt : components)
{
    if (opt) // component exists
    {
        operate_on_component(*opt);
    }
    else     // component does not exist
    {
        // whatever
    }
}
// move components to the front, non-components to the back
std::parition(components.begin(), components.end(),
    [](boost::optional<component> const& opt) -> bool { return opt; });

简短的回答是,这取决于你如何在内存中存储它。

例如,ansi标准建议连续分配向量。

如果可以预测对象的大小,则可以使用size_of和addressing等函数来预测对象在内存中的位置。

好运。

至少有两种解决方案:

1)用一些标志标记孔,加工时跳过。优点:"删除"非常快(只设置一个标志)。如果对象不是那么小,甚至添加一个"bool alive"标志也不难做到。

2)在池的末端移动一个洞,并将其替换为一些"活的"对象。

这个问题与存储和处理粒子系统有关,你可以在那里找到一些建议。

如果不可能向上移动"活动"组件,或者重新排序它们,这样在序列中间就没有洞了,那么最好的选择是给组件对象一个"deleted"标志/状态,可以通过成员函数进行测试。
这样的"已删除"状态不会导致对象从内存中删除(这在较大的块中是不可能的),但它确实可以将该位置标记为组件未被使用。

当你说你已经"分配了一些内存"时,你可能在谈论一个数组。数组非常好,因为它们几乎没有开销,而且通过索引访问非常快。但是数组的缺点是它们不适合调整大小。当你删除中间的一个元素时,后面的所有元素都必须向后移动一个位置。

但幸运的是,您可以使用其他数据结构,如链表或二叉树,它们允许快速删除元素。c++甚至在容器类std::list和std::set中实现了这些。

当你事先不知道你需要多少元素时,列表是很好的,因为当你删除或添加任何元素时,它可以动态收缩和增长,而不会浪费任何内存。此外,添加和删除元素非常快,无论您是在开始,最后还是中间的某个位置插入元素。

集合非常适合快速查找。当你有一个对象,你想知道它是否已经在集合中,检查它是非常快的。set还会自动丢弃重复项,这在许多情况下非常有用(当您需要重复项时,可以使用std::multiset)。就像列表一样,它可以动态地适应,但添加新对象不如列表中快(尽管不如数组中昂贵)。

两个建议:

1)你可以使用链表来存储你的组件,然后不用担心漏洞。

或者如果你需要这些洞:

2)你可以把你的组件包装成一个对象,用一个指针指向组件,像这样:
class ComponentWrap : public
{
   Component component;
}

并使用ComponentWrap.component == null查找组件是否被删除

异常:

把你的代码放在try catch块中,以防你遇到空指针错误。