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

时间:2013-02-14 21:00:48

标签: c++ qt heap

说我有一个名为的成员变量 结果m_result

class Result{
QList<Group *> m_groups
}

和群组

class Group{
QList<Data> m_data
}

随着程序的继续,每个组的数据QList都在不断增长。所有组都在堆中分配(因此指针)。实质上,每个组都在堆中分配ONCE。每次QList增长时,是否会重新分配特定组?另外,由于数据成员的增长,m_testResult是否会一遍又一遍地重新复制?

2 个答案:

答案 0 :(得分:7)

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

可以找到QList的详细信息here - 它使用指向<T>的指针数组,因此不是链接列表。因为它使用指向元素的指针,所以在调整数组大小时不必复制元素,只需复制指针(或者如果它以类似于VList的方式实现,可能不会 - 我没有看到任何东西在文档中指示它使用的策略),因此每当其QList增长时,特定的组将不会重新分配。

答案 1 :(得分:2)

我特别不了解QList,但总的来说,我希望如下:

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

  • 删除(现有)元素后,元素的前任链接到其后继元素,持有元素的内存为delete - ed。

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

  • 对象永远不会增长,但可以反复声明和释放内存。