在Qt控制台场景中没有调用析构函数

时间:2012-11-20 01:12:45

标签: c++ qt

我有一个看似简单的问题,但无论如何我想了解答案。

示例代码如下。


   #include <QtCore/QCoreApplication>
    #include "parent.h"
    #include "childa.h"
    #include "childb.h"

    int main(int argc, char *argv[])
    {
        QCoreApplication a(argc, argv);

        Parent one;
        ChildA two;
        ChildB three;

        return a.exec();
    }

#ifndef CHILDA_H
#define CHILDA_H

#include <iostream>
#include "parent.h"

using namespace std;

class ChildA : public Parent
{
public:
    ChildA();
    ~ChildA();
};

#endif // CHILDA_H

  #ifndef CHILDB_H
    #define CHILDB_H

    #include <iostream>
    #include "parent.h"

    using namespace std;

    class ChildB : public Parent
    {
    public:
        ChildB();
        ~ChildB();
    };

    #endif // CHILDB_H

#ifndef PARENT_H
#define PARENT_H

#include <iostream>

using namespace std;

class Parent
{
public:
    Parent();
    virtual ~Parent();
};

#endif // PARENT_H

#include "childa.h"

ChildA::ChildA()
{
    cout << "in Child A const\n";
}

ChildA::~ChildA()
{
    cout << "in Child A destructor\n";
}

#include "childb.h"

ChildB::ChildB()
{
    cout << "in Child B const\n";
}

ChildB::~ChildB()
{
    cout << "in Child B destructor\n";
}

#include "parent.h"

Parent::Parent()
{
    cout << "in Parent const\n";
}

Parent::~Parent()
{
    cout << "in Parent destructor\n";
}

为什么我没有看到被称为析构函数? 对象变量应该超出main的范围,应该调用析构函数,不是吗?

1 个答案:

答案 0 :(得分:1)

您的对象永远不会超出范围,因为您的应用程序不存在(即您不会超出主要功能的范围)。你需要关闭你的应用程序,你这样做:

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    Parent one;
    ChildA two;
    ChildB three;
    // This will immediately terminate the application
    QTimer::singleShot(0, &a, SLOT(quit()));
    return a.exec();
}

请注意,您可以将计时器设置为在特定时间内执行,对于上面的示例,我将其设置为在0 ms后执行。

如果您不想关闭该应用程序,则可以强制使用范围

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    // Force scope
    {
        Parent one;
        ChildA two;
        ChildB three;
    }

    return a.exec();
}