当堆中分配的对象变大时会发生什么
What happens when an object allocated in the heap gets larger?
假设我有一个名为结果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::list
或std::slist
-
对象永远不会增长,但内存可以重复使用和释放
相关文章:
- 初始化或分配空字符串文字到指向 C 中的 char 的指针或指向 C++ 中 const char 的指针的原因是什么
- unique_ptr:在分配之前调用 reset 有什么效果
- 将指针分配给另一个指针时会发生什么情况?
- 在什么情况下,两个堆栈分配的结构对象的 this 点指向同一个地址?
- 为对象分配整数.输出将是什么?
- 重新分配向量时,向量中的内存会发生什么情况
- C++程序什么都不做,但瓦尔格林德显示内存分配
- C++指针中的这两种类型的值分配有什么区别?
- 删除类成员的动态分配内存的最佳方法是什么
- 我在 2D 数组的动态内存分配中遇到了一些奇怪的代码C++? 请解释一下这是什么?
- 虚函数如何工作,分配后新的返回类型会发生什么?
- 将共享指针传递给函数参数 - 将其分配给局部变量的正确方法是什么
- 如果链表被重新分配,会发生什么
- 堆指针不会被分配给数组有什么原因吗
- 如果您为类的一个对象动态分配内存作为参数,会发生什么
- 右值需要分配什么向后兼容性
- scanf() 语句中"%*[^n]"的格式字符串指示什么?分配抑制器 (*) 和否定扫描集 ([^) 如何协同工作?
- 在C++中,从构造函数中将字符串文本分配给成员const char*变量时会发生什么
- 按引用传递和动态内存分配之间的区别是什么
- 如何知道是什么分配了给定的内存块