使用Visual Studio和Qt 5.3创建QML应用程序时在退出时崩溃
我一直在通过qmlRegisterType玩QML应用程序和扩展,我偶然发现了一件奇怪的事情:我有两个项目。第一个生成一个自定义QML类型的dll,第二个是一个非常简单的应用程序,如下所示: main.cpp:使用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.
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个独立堆)。现在我觉得自己很愚蠢,我切换到调试运行时,它现在正常关闭。。。非常感谢,我本可以花更多的时间才注意到这一点!