C++ 如何在关闭信号时删除QML窗口(如何正确执行)?

C++ 如何在关闭信号时删除QML窗口(如何正确执行)?,c++,qt,memory-management,garbage-collection,qml,C++,Qt,Memory Management,Garbage Collection,Qml,我在qt+qml方面有一些问题:有时我在试图清除QQmlengine时遇到分段错误。即使程序没有崩溃,它也有内存泄漏。(对不起我的英语)。我这样认为是因为较大的qml文件(许多嵌套类)甚至在QQML文件被删除后,也会导致较大的应用程序进程。所以我的问题是我在下面的代码中做错了什么 //main.cpp #include "qmlwindow.h" #include <QApplication> int QMLwindow::someValue = 0; int main(in

我在qt+qml方面有一些问题:有时我在试图清除QQmlengine时遇到分段错误。即使程序没有崩溃,它也有内存泄漏。(对不起我的英语)。我这样认为是因为较大的qml文件(许多嵌套类)甚至在QQML文件被删除后,也会导致较大的应用程序进程。所以我的问题是我在下面的代码中做错了什么

//main.cpp
#include "qmlwindow.h"
#include <QApplication>



int QMLwindow::someValue = 0;

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    a.setQuitOnLastWindowClosed(false);

    QSharedPointer<QMLwindow> w0(new QMLwindow);
    QSharedPointer<QMLwindow> w1(new QMLwindow);
    QSharedPointer<QMLwindow> w2(new QMLwindow);
    w0.data()->createWindow();
    w0.data()->createWindow();
    w1.data()->createWindow();
    w2.data()->createWindow();

    return a.exec();
}
//qmlwindow.h
#ifndef QMLWINDOW_H
#define QMLWINDOW_H

#include <QObject>
#include <QQmlComponent>
#include <QQuickWindow>
#include <QSharedPointer>
#include <QDebug>
#include <QQmlEngine>
#include <QQmlContext>


class QMLwindow : public QObject
{
    Q_OBJECT
private:
    QSharedPointer<QQmlEngine> engine;
    QQmlComponent *component;
    QObject *windowObj;
    QQuickWindow *loginWindow;
    QVariant count;
public:
    static int someValue;
    explicit QMLwindow(QObject *parent = 0);
    ~QMLwindow();
    void createWindow();
signals:

public slots:
    void deleteWindow(QQuickCloseEvent *event);
};

#endif // QMLWINDOW_H
//qmlwindow.cpp
#include "qmlwindow.h"

QMLwindow::QMLwindow(QObject *parent) : QObject(parent)
{

    someValue++;
    count = someValue;
qDebug() << "construction of QMLwindow " << count.toInt();
}

QMLwindow::~QMLwindow()
{
qDebug() << "destruction of QMLwindow " << count.toInt();
}

void QMLwindow::createWindow(){
    if(engine.isNull()){
        engine = QSharedPointer<QQmlEngine>(new QQmlEngine);
        component = new QQmlComponent(engine.data());
        component->loadUrl(QUrl(QStringLiteral("qrc:/SomeWindow.qml")));
        Q_ASSERT(component->isReady());
        windowObj = component->create();
        loginWindow = qobject_cast<QQuickWindow *> (windowObj);
        engine.data()->rootContext()->setContextProperty("someValue", count) ;
        connect(loginWindow, SIGNAL(closing(QQuickCloseEvent*)), SLOT(deleteWindow(QQuickCloseEvent*)));

        loginWindow->show();
    }
    else loginWindow->show();
}

void QMLwindow::deleteWindow(QQuickCloseEvent*event){
    Q_UNUSED(event)

    if(!engine.isNull()) {
        qDebug() << "loginWindow destruction";
        engine.clear();
    }
    this->deleteLater();
}
//SomeWindow.qml
import QtQuick 2.3
import QtQuick.Window 2.0

Window {

    width: 200
    height: 200
    color: "white"
    Text{
     text: someValue
     anchors.centerIn: parent
    }
}