最近在做項目時,遇到一個奇怪的問題——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
這時,則不會出現段錯誤。
這個得好好研究研究爲什麼。。。。。。。