图示形象化理解:
堆栈都是数据结构存取数据的方式
堆:理解为一个堆积物体,独立的分散的,当需要空间时,再找一个地方。需要的就是new关键字,动态申请一个空间。程序员自己动态分配空间,使用指针操作,不使用时,手动在析构函数里删除指针
动态创建对象
栈:可以理解火车站的站,是通过调度是统一安排停放在哪个位置,占用存储空间,无需自己考虑。程序员无需考虑空间分配问题,无需在析构函数中处理。
静态创建对象
栈的容量较小,一般只有几百KB到几MB的空间
---------------------------------------------------------------------------------------------
-
内存分配方式:
- 栈:由操作系统或编译器自动分配和释放,通常用于存储局部变量、函数参数和控制信息。栈的内存分配是按照“后进先出”的原则进行的,即最后一个进入栈的变量最先被释放。栈的容量较小,一般只有几百KB到几MB的空间。
- 堆:由程序员手动申请和释放,用于存储动态分配的内存,如大型数据结构和对象。堆的空间较大,可以动态扩展内存空间,以满足程序的需求。
-
管理方式:
- 栈:由操作系统自动管理,其生命周期与函数调用周期相匹配。函数调用结束后,栈上分配的内存会自动被释放,无需程序员过多考虑内存的分配和释放问题。
- 堆:需要程序员自行负责内存管理,使用完毕后必须手动释放,否则会导致内存泄漏或其他问题。堆的内存管理涉及复杂的算法,可能会引入额外的开销。
-
空间大小:
- 栈:空间大小相对较小,主要用于存储临时变量和控制信息。
- 堆:空间较大,可以动态分配大块内存以满足程序的需求。
-
生长方向:
- 栈:向低地址扩展。
- 堆:向高地址扩展。
-
效率:
- 栈:由于分配和释放是自动进行的,所以操作效率比堆高。访问栈中的数据直接存放在系统内存中,速度较快。
- 堆:操作涉及复杂的内存管理算法,可能会引入额外的开销,导致访问速度相对较慢。访问堆中的数据需要通过指针进行间接访问,会造成一定的时间损耗。
-
应用场景:
- 栈:适合用于存储局部变量和函数调用,主要用于内存的临时分配。
- 堆:适合用于存储需要动态分配和管理的数据结构,如动态数组、字符串、对象等。
举例:
创建一个debug.h的窗口类
栈方式,静态创建对象(没有星号*,不是指针):
debug aa2;
aa2.setModal(true);
aa2.showNormal();//此方式窗口一闪而过
int age=18;
堆方式,动态创建
debug* aa2;
aa2 = new debug(this);
aa2->setModal(true);
aa2->showNormal();
如何限制对象建立在栈上呢?不让静态创建对象
设置析构函数private
调用是提示不可访问
QT的内存回收机制:
Qt中有内存回收机制, 但是不是所有被new出的对象被自动回收, 满足条件才可以回收
如果想要在Qt中实现内存的自动回收, 需要满足以下两个条件:
- 创建的对象必须是QObject类的子类(间接子类也可以)
- 创建出的类对象, 必须要指定其父对象是谁, 一般情况下有两种操作方式:
参考:https://blog.csdn.net/qq_41701723/article/details/131889164