QT對象釋放順序引起的報錯問題

最近在做項目時,遇到一個奇怪的問題——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

這時,則不會出現段錯誤。

這個得好好研究研究爲什麼。。。。。。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章