从内存中删除对象
C++ Deleting objects from memory
假设我已经分配了一些内存,并将其填充为一组相同类型的对象,我们将这些对象称为组件。
假设其中一个组件需要删除,那么有什么好方法可以让组件创建的"漏洞"可以被测试,并通过循环迭代一组对象来跳过?
反过来也应该成立,我希望能够测试一个洞,以便在空间中存储新的组件。
我在想核&
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
查找组件是否被删除
异常:
- 线程调用的函数对对象删除是否安全?
- 当我使用dynamic_cast并删除对象删除时,析构函数是如何工作的?
- 使用 com 对象删除计划任务
- C 将对象删除为参考
- C样式对象删除的包装器
- 静态映射中动态分配的对象.删除必要的
- C++指向对象删除的指针数组,"Debug assertion failure!"
- 在其成员函数返回之前,将对象删除是不确定的行为吗?
- Python 对象删除检测
- C++安全对象删除
- Qt:RemoveWidget和对象删除
- Qt对象删除导致崩溃
- 删除由两个shared_pointer实例管理的对象(删除其中一个)
- 顶点缓冲区对象(删除进程)opengl
- 设计 -- 按名称或对象删除
- 提升中的异常:进程间,共享内存对象删除
- 使用std::function和std::bind来存储回调并处理对象删除
- 如何使用智能指针防止双重对象删除
- 指针指向对象删除时自动为空
- 对象层次结构中的对象删除责任