QT c++ 堆栈一些理解--限制对象建立在栈上--栈堆区别

图示形象化理解:

 堆栈都是数据结构存取数据的方式

堆:理解为一个堆积物体,独立的分散的,当需要空间时,再找一个地方。需要的就是new关键字,动态申请一个空间。程序员自己动态分配空间,使用指针操作,不使用时,手动在析构函数里删除指针

动态创建对象

 

栈:可以理解火车站的站,是通过调度是统一安排停放在哪个位置,占用存储空间,无需自己考虑。程序员无需考虑空间分配问题,无需在析构函数中处理。

静态创建对象

栈的容量较小,一般只有几百KB到几MB的空间

---------------------------------------------------------------------------------------------

 

  1. 内存分配方式:

    • 栈:由操作系统或编译器自动分配和释放,通常用于存储局部变量、函数参数和控制信息。栈的内存分配是按照“后进先出”的原则进行的,即最后一个进入栈的变量最先被释放。栈的容量较小,一般只有几百KB到几MB的空间。
    • 堆:由程序员手动申请和释放,用于存储动态分配的内存,如大型数据结构和对象。堆的空间较大,可以动态扩展内存空间,以满足程序的需求。
  2. 管理方式:

    • 栈:由操作系统自动管理,其生命周期与函数调用周期相匹配。函数调用结束后,栈上分配的内存会自动被释放,无需程序员过多考虑内存的分配和释放问题。
    • 堆:需要程序员自行负责内存管理,使用完毕后必须手动释放,否则会导致内存泄漏或其他问题。堆的内存管理涉及复杂的算法,可能会引入额外的开销。
  3. 空间大小:

    • 栈:空间大小相对较小,主要用于存储临时变量和控制信息。
    • 堆:空间较大,可以动态分配大块内存以满足程序的需求。
  4. 生长方向:

    • 栈:向低地址扩展。
    • 堆:向高地址扩展。
  5. 效率:

    • 栈:由于分配和释放是自动进行的,所以操作效率比堆高。访问栈中的数据直接存放在系统内存中,速度较快。
    • 堆:操作涉及复杂的内存管理算法,可能会引入额外的开销,导致访问速度相对较慢。访问堆中的数据需要通过指针进行间接访问,会造成一定的时间损耗。
  6. 应用场景:

    • 栈:适合用于存储局部变量和函数调用,主要用于内存的临时分配。
    • 堆:适合用于存储需要动态分配和管理的数据结构,如动态数组、字符串、对象等。

举例:

创建一个debug.h的窗口类

 

 栈方式,静态创建对象(没有星号*,不是指针):

debug aa2;
aa2.setModal(true);
aa2.showNormal();//此方式窗口一闪而过

堆方式,动态创建

debug* aa2;

aa2 = new debug(this);

aa2->setModal(true);

aa2->showNormal();

 

如何限制对象建立在栈上呢?不让静态创建对象

设置析构函数private

 调用是提示不可访问

 

QT的内存回收机制:

Qt中有内存回收机制, 但是不是所有被new出的对象被自动回收, 满足条件才可以回收

如果想要在Qt中实现内存的自动回收, 需要满足以下两个条件:

  1. 创建的对象必须是QObject类的子类(间接子类也可以)
  2. 创建出的类对象, 必须要指定其父对象是谁, 一般情况下有两种操作方式:

     参考:https://blog.csdn.net/qq_41701723/article/details/131889164

 

 

 

 

 

posted @ 2024-06-06 09:45  txwtech  阅读(77)  评论(0编辑  收藏  举报