【问题标题】:crash at exit when creating a QML application with Visual Studio and Qt 5.3使用 Visual Studio 和 Qt 5.3 创建 QML 应用程序时在退出时崩溃
【发布时间】:2014-09-30 16:21:01
【问题描述】:

我一直在通过 qmlRegisterType 玩 QML 应用程序和扩展,我偶然发现了一件奇怪的事情:我有 2 个项目。第一个生成具有自定义 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
    }
}

当我通过 Qt Creator 运行我的项目时,一切正常,当我单击窗口上的任意位置时,它会正常关闭。

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

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

我花了很多时间浏览 Google 等,但找不到任何有用的东西。我想我的项目中可能缺少一些编译选项,Qt Creator 会自动添加,但我不知道是哪一个:/

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

提前感谢您的帮助!

【问题讨论】:

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

标签: qt visual-c++


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-17
    • 1970-01-01
    相关资源
    最近更新 更多