我一直在通过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的特殊版本来生成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
我花了很多时间浏览Google等,但是找不到任何有用的信息。我认为可能是我的项目中缺少一些编译选项,Qt Creator自动添加了该选项,但我不知道哪个:/
我知道仅仅关注这个问题可能不足以找到解决方案,因此我准备了一个小型项目,可以完美地再现问题。如果您愿意尝试,请随时给我发消息,然后我会发送给您(很遗憾,我没有任何保管箱帐户或类似帐户)
在此先感谢您的帮助!
您在调试应用程序和调试Qt dll中至少使用了版本CRT msvcr120.dll。在同一应用程序中混合使用Debug和Release是不安全的,因为这会创建多个1个独立的堆。如果在释放堆中分配内存,则无法在调试堆中释放内存,反之亦然,因为这样做会破坏堆。同样,堆损坏并不一定会导致下一次分配/释放时立即崩溃,因此变得难以调试。您发现使用正确的CRT可以解决此问题。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句