Qt的半自动化的内存管理
(1)QObject及其派生类的对象,如果其parent非0,那么其parent析构时会析构该对象。
(2)QWidget及其派生类的对象,可以设置 Qt::WA_DeleteOnClose 标志位(当close时会析构该对象)。
(3)QAbstractAnimation派生类的对象,可以设置 QAbstractAnimation::DeleteWhenStopped。
(4)QRunnable::setAutoDelete()、MediaSource::setAutoDelete()。
(5)父子关系:父对象、子对象、父子关系。这是Qt中所特有的,与类的继承关系无关,传递参数是与parent有关(基类、派生类,或父类、子类,这是对于派生体系来说的,与parent无关)。
在使用QT的时候,我们一般会在类的构造函数中new出很多对象,这些对象会在什么时候被delete呢?
之前一直有一个错误的理解:认为对象在被销毁时QT会自动回收其构造函数new出来的成员。直到最近使用valgrind工具检测内存泄漏时发现,有些堆中的数据并没有被delete。
这些数据包括:1.在构造函数被new出来,但是没有指定parent的对象 (需要在虚构函数手动 delete)
2.在构造函数中QAbstractAnimation派生类,虽然指定了parent但是Qt依然没有回收 (需要在虚构函数手动 delete)
3.非构造函数new出来的数据,没有在相应的地方delete (需要在虚构函数或其他地方手动 delete)
以上三种情况是我们写程序时经常遇到的,稍微不注意就会引起内存泄漏。
使用valgrind检测程序内存泄漏方法:
valgrind --tool=memcheck --leak-check=full ./yourprogram &> outputfile
关于valgrind的其他使用方法请自行百度。
更多推荐
QT内存泄漏
发布评论