最近在做项目时,遇到一个奇怪的问题——QT对象释放的顺序不对的话,会引起崩溃。具体是这样的:
1、先定义两个QT类(Class1、Class2),下面是头文件:
#include <QObject>
class Class1 : public QObject
{
Q_OBJECT
public:
explicit Class1(QObject *parent = 0);
~Class1();
signals:
public slots:
};
#include <QObject>
class Class2 : public QObject
{
Q_OBJECT
public:
explicit Class2(QObject *parent = 0);
~Class2();
signals:
public slots:
};
2、两个类的实现文件如下:
#include "class1.h"
#include <iostream>
using namespace std;
Class1::Class1(QObject *parent) : QObject(parent)
{
cout<<__func__<<" "<<__LINE__<<endl;
}
Class1::~Class1()
{
cout<<__func__<<" "<<__LINE__<<endl;
}
#include "class2.h"
#include <iostream>
using namespace std;
Class2::Class2(QObject *parent) : QObject(parent)
{
cout<<__func__<<" "<<__LINE__<<endl;
}
Class2::~Class2()
{
cout<<__func__<<" "<<__LINE__<<endl;
}
3、使用这两个类声明对象:
Class1 *pcls1 = new Class1;
Class2 *pcls2 = new Class2(pcls1);
4、奇怪的地方来了——释放上面的两个对象。
情况1、按照下面顺序释放,打印信息如下:
Class1 7
Class2 7
~Class1 12
~Class2 12
执行delete pcls1时,会调用到Class2的析构函数,导致在执行delete pcls2的时候,出现段错误:
delete pcls1;
delete pcls2;
情况2、如果按照下面的顺序来释放,打印信息是这样的:
Class1 7
Class2 7
~Class2 12
~Class1 12
这时,则不会出现段错误。
这个得好好研究研究为什么。。。。。。。