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

这时,则不会出现段错误。

这个得好好研究研究为什么。。。。。。。

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