当堆中分配的对象变大时会发生什么

What happens when an object allocated in the heap gets larger?

本文关键字:什么 分配 对象      更新时间:2023-10-16

假设我有一个名为结果m_Result

class Result{
QList<Group *> m_groups
}

和集团

class Group{
QList<Data> m_data
}

随着该计划的继续,每个小组的QList数据不断增长。所有组都是在堆中分配的(因此是指针)。本质上,每个组在堆中被分配一次。某个特定组的QList每次增长时都会被重新分配吗?此外,m_testResult是否会因为Data成员的增长而一次又一次地被重新拷贝?

在QList内部,会有指向其他一些实际保存数据的对象或数组的指针。随着列表的增长,将为此备份数据分配新对象,并删除现有对象。您所展示的代码不必担心,但如果您要实现自己的集合,那么您可以。一旦被分配,对象本身就永远不会增长。

QList的详细信息可以在这里找到——它使用指向<T>的指针数组,所以不是链表。由于它使用指向元素的指针,因此在调整数组大小时不必复制元素,只需复制指针(如果它以与VList类似的方式实现,则可能不复制指针-我在文档中没有看到任何内容来指示它使用的策略),因此特定的组不会在每次QList增长时被重新分配

我不知道QList的具体情况,但总的来说,我会期望以下内容:

  • 在添加新元素时,QList分配(new)更多的内存,并将最后一个元素链接到新元素。

  • 删除(现有)元素后,该元素的前一个元素将链接到其后一个元素,保存该元素的内存为delete-ed。

  • 这是任何链表如何工作的一般原则,例如std::liststd::slist

  • 对象永远不会增长,但内存可以重复使用和释放