关于Qt/C++内存管理机制
C++内存管理相较于有自动垃圾回收系统(GCC)的语言相对需要注意的细节更多。本文谨记录Qt学习中遇到关于内存管理的杂项,以更加清楚的认识Qt/C++的内存管理,也作未来的参考和学习过程中加深印象之用。
Qt中对象主要分为两类,QObject或其派生类对象,普通C++类对象
后者内存分配同C++原则。
前者通常有一个parent父对象指针。此非指针非Null时可将本对象加入父对象树中。此时父对象被析构时所有子对象也将自动析构。Null时 代表此对象无父对象,即Qt将无法自动析构此对象。
在局部作用域,如函数内部创建的对象如未显示调用new将在stack上分配内存,而在全局范围声明的对象将在heap上分配内存,因为Qt的parent特性,即使在heap上分配内存也无需担心内存泄漏。总的来说,关于是在堆上还是在栈上创建对象,依赖于这个对象所需要的生命周期,与其它无关。
需要注意的细节;
1、对象只需要在局部作用域(stack)存在时可以选择不进行内存分配,利用局部作用域变量的生命周期自动清理资源。
2、对于在局部作用域上创建的父对象及其子对象,要注意对象销毁的顺序,因为父对象销毁时也会销毁子对象,当子对象会在父对象之后被销毁时会引发二次析构。
3、以往编码时常省略new QWidget对象时的参数如(this),这样将导致子对象的父对象被设置为Null,导致父对象析构时子对象未能自动析构,这样会出现程序运行时的内存泄漏。