2

単純すぎると思われる質問がありますが、とにかく答えを理解したいと思います。

以下のコード例。


   #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";
}

デストラクタが呼び出されていないのはなぜですか?
オブジェクト変数はメインのスコープ外に出て、デストラクタを呼び出す必要がありますよね?

4

1 に答える 1

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 ミリ秒後に実行するように設定しました。

アプリケーションを閉じたくない場合は、スコープを強制できます

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

    return a.exec();
}
于 2012-11-20T01:19:39.033 に答える