Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Visual Studio和Qt 5.3创建QML应用程序时在退出时崩溃_Qt_Visual C++ - Fatal编程技术网

使用Visual Studio和Qt 5.3创建QML应用程序时在退出时崩溃

使用Visual Studio和Qt 5.3创建QML应用程序时在退出时崩溃,qt,visual-c++,Qt,Visual C++,我一直在通过qmlRegisterType玩QML应用程序和扩展,我偶然发现了一件奇怪的事情:我有两个项目。第一个生成一个自定义QML类型的dll,第二个是一个非常简单的应用程序,如下所示: main.cpp: int main(int argc, char *argv[]) { QGuiApplication app(argc, argv); QQmlApplicationEngine engine(QUrl("qrc:/main.qml")); return app.

我一直在通过qmlRegisterType玩QML应用程序和扩展,我偶然发现了一件奇怪的事情:我有两个项目。第一个生成一个自定义QML类型的dll,第二个是一个非常简单的应用程序,如下所示:

main.cpp:

int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);
    QQmlApplicationEngine engine(QUrl("qrc:/main.qml"));
    return app.exec();
}
main.qml

import QtQuick 2.3
import QtQuick.Window 2.2
import TestLib 1.0

Window {
    visible: true
    width: 360
    height: 360

    MouseArea {
        anchors.fill: parent
        onClicked: {
            Qt.quit();
        }
    }

    HelloWorld {
        id: hello
        test: "Foo !!"
    }

    Text {
        anchors.centerIn: parent
        text: hello.test
        font.pointSize: 40
    }
}
当我通过QtCreator运行我的项目时,一切正常,当我单击窗口上的任意位置时,它会正常关闭

但是现在,如果我试图通过Visual Studio项目编译完全相同的代码(我使用Premake的特殊版本生成Visual Studio解决方案和项目文件,这些文件可以正确处理Qt特殊文件),那么一切都会编译好,运行正常,但只要我单击窗口,就会出现以下调用堆栈崩溃:

ntdll.dll!RtlFreeHeap() Unknown
kernel32.dll!HeapFree() Unknown
msvcr120.dll!free(void * pBlock) Line 51    C
TestLib.dll!000007fef7bb6d6c()  Unknown
Qt5Cored.dll!QObjectPrivate::deleteChildren() Line 1936 C++
Qt5Cored.dll!QObject::~QObject() Line 1030  C++
Qt5Quickd.dll!QQuickItem::~QQuickItem() Line 2120   C++
Qt5Quickd.dll!QQuickRootItem::~QQuickRootItem() C++
Qt5Quickd.dll!QQuickRootItem::`scalar deleting destructor'(unsigned int)    C++
Qt5Quickd.dll!QQuickWindow::~QQuickWindow() Line 1102   C++
Qt5Quickd.dll!QQuickWindowQmlImpl::~QQuickWindowQmlImpl()   C++
Qt5Quickd.dll!QQmlPrivate::QQmlElement<QQuickWindowQmlImpl>::~QQmlElement<QQuickWindowQmlImpl>() Line 106   C++
Qt5Quickd.dll!QQmlPrivate::QQmlElement<QQuickWindowQmlImpl>::`scalar deleting destructor'(unsigned int) C++
Qt5Qmld.dll!qDeleteAll<QList<QObject * __ptr64>::const_iterator>(QList<QObject *>::const_iterator begin, QList<QObject *>::const_iterator end) Line 323 C++
Qt5Qmld.dll!qDeleteAll<QList<QObject * __ptr64> >(const QList<QObject *> & c) Line 332  C++
Qt5Qmld.dll!QQmlApplicationEnginePrivate::cleanUp() Line 64 C++
Qt5Qmld.dll!QQmlApplicationEngine::~QQmlApplicationEngine() Line 241    C++
TestApp.exe!000000013faf2630()  Unknown
TestApp.exe!000000013faf4197()  Unknown
ntdll.dll!RtlFreeHeap()未知
内核32.dll!HeapFree()未知
msvcr120.dll!自由(空隙*pBlock)线51 C
TestLib.dll!000007fef7bb6d6c()未知
qt5corder.dll!QubjtBoe::DeleTeEngEnter()1936行C++
qt5corder.dll!QObj::~QObjutt()1030行C++
Qt5Quickd.dll!QQuickItem:~qQuiTime()2120行C++
Qt5Quickd.dll!QQuickRootItem:~qQueQuoTym()C++
Qt5Quickd.dll!QQuickRootItem:“标量删除析构函数”(无符号int)C++
Qt5Quickd.dll!QQuickWindow:~qQuestWOWW()1102行C++
Qt5Quickd.dll!QQuickWindowQmlImpl:~qQuestWOWQMLIN()C++
Qt5Quickd.dll!QQMLIPOR:::QQMLYNET::~qqMLeleMeMe()106行C++
Qt5Quickd.dll!qqMLIPOL::QQMLINE::“标量删除析构函数”(无符号int)C++
Qt5Qmld.dll!qDeleTeLead(qList::CopyTythRealthActer,QList::CistigiExter)323 C++
Qt5Qmld.dll!QDeleTeAL(const qLead和C)332行C++
Qt5Qmld.dll!QC++应用程序64:C++
Qt5Qmld.dll!QQmlApplicationEngine:~QQMLAPPLICATION()第241行C++
TestApp.exe!000000013faf2630()未知
TestApp.exe!000000013faf4197()未知
我花了很多时间浏览谷歌之类的网站,但找不到任何有用的东西。我想可能我在我的项目中缺少了一些编译选项,Qt Creator会自动添加这些选项,但我不知道是哪一个:/

我知道仅仅看这个问题可能不足以找到解决方案,所以我准备了一个小项目,完美地再现了这个问题。如果您愿意尝试,请随时给我留言,我会将其发送给您(不幸的是,我没有任何dropbox帐户或等效帐户)


提前感谢您的帮助

您在调试应用程序和调试Qt dll中至少使用了CRT msvcr120.dll版本的一部分。在同一个应用程序中混合调试和发布是不安全的,因为这会创建多个独立堆。如果在释放堆中分配内存,则无法在调试堆中释放内存,反之亦然,因为这样做会损坏堆。此外,堆损坏不一定会在下一次分配/解除分配时导致即时崩溃,因此很难进行调试。正如您所发现的,使用正确的CRT将解决此问题。

我关心的是msvcr120.dll。我本来希望是msvcr120d.dll。我提到这一点的原因是在调试应用程序中使用Release DLL或在Release应用程序中使用Debug DLL是不安全的(没有隔离,因为有超过1个独立堆)。现在我觉得自己很愚蠢,我切换到调试运行时,它现在正常关闭。。。非常感谢,我本可以花更多的时间才注意到这一点!