我正在做一个最近迁移到Qt 5.3.0的项目(之前它运行在Qt 5.2.1上)。
我的项目是基于一个QQuickView对象被填充了一些QML文件,这取决于我从通信协议收到的一些命令…
因为我是在Qt 5.2.1系统工作得很好,坚不可摧:从来没有一个问题。现在使用Qt 5.3.0,如果我关闭QQuickView窗口,进程崩溃,输出如下:
** glibc检测到**/home/morx/dev/aesys/vled/build/bin/vled: free():无效指针:0x091ec694 **
======= Backtrace: =========
/lib/i386-linux-gnu libc.so.6 (+ 0 x75ee2) [0 xb5c1fee2]/usr/lib/i386-linux-gnu/libstdc + + .so.6 (_ZdlPv + 0 x1f) [0 xb5e1b51f]/opt/Qt/5.3/gcc/lib/libQt5Qml.so.5 (_ZN21QQmlImageProviderBaseD0Ev + 0 x24) [0 xb7136110]/opt/Qt/5.3/gcc/lib/libQt5Qml.so.5 (+ 0 x211f59) [0 xb713cf59]/opt/Qt/5.3/gcc/lib/libQt5Qml.so.5 (+ 0 x2138b3) [0 xb713e8b3]/opt/Qt/5.3/gcc/lib/libQt5Core.so.5 (_ZN9QHashData11free_helperEPFvPNS_4NodeEE + 0 x4a) [0 xb5f40e7a]/opt/Qt/5.3/gcc/lib/libQt5Qml.so.5 (_ZN17QQmlEnginePrivateD1Ev + 0 x8ab) [0 xb71378c5]/opt/Qt/5.3/gcc/lib/libQt5Qml.so.5 (_ZN17QQmlEnginePrivateD0Ev + 0 x1c) [0 xb7137a7c]/opt/Qt/5.3/gcc/lib/libQt5Core.so.5 (_ZN7QObjectD1Ev + 0 x6a1) [0 xb6173031]/opt/Qt/5.3/gcc/lib/libQt5Qml.so.5 (_ZN9QJSEngineD1Ev + 0 x36) [0 xb70352b6]/opt/Qt/5.3/gcc/lib/libQt5Qml.so.5 (_ZN10QQmlEngineD1Ev + 0 xf0) [0 xb71398fe]/opt/Qt/5.3/gcc/lib/libQt5Qml.so.5 (_ZN10QQmlEngineD0Ev + 0 x1c) [0 xb71399e2]/opt/Qt/5.3/gcc/lib/libQt5Core.so.5 (_ZN14QObjectPrivate14deleteChildrenEv + 0 x6c) [0 xb616e4ac]/opt/Qt/5.3/gcc/lib/libQt5Core.so.5 (_ZN7QObjectD1Ev + 0 x661) [0 xb6172ff1]/opt/Qt/5.3/gcc/lib/libQt5Gui.so.5 (_ZN7QWindowD2Ev + 0 x6d) [0 xb646a7bd]/opt/Qt/5.3/gcc/lib/libQt5Quick.so.5 (_ZN12QQuickWindowD1Ev + 0 xd9) [0 xb74878e9]/opt/Qt/5.3/gcc/lib/libQt5Quick.so.5 (_ZN10QQuickViewD1Ev + 0 x9a) [0 xb753925a]/home/morix/devel/aesys/VLED/build/bin/VLED [0 x8059bbe]/home/morix/devel/aesys/VLED/build/bin/VLED [0 x8059c8f]/home/morix/devel/aesys/VLED/build/bin/VLED [0 x8051368]/home/morix/devel/aesys/VLED/build/bin/VLED [0 x804d429]/lib/i386-linux-gnu/libc.so.6 (__libc_start_main + 0 xf3) [0 xb5bc34d3]/home/morix/devel/aesys/VLED/build/bin/VLED [0 x804d2b1]
(VLED是我在上面输出的项目名称)。
似乎QQmlImageProviderBase中的一些free()调用正在一个无效的指针上工作…
请考虑在我的项目中,我使用qqmlimageproviderbase派生类来提供一些"实时"像素图到QML…但我不认为问题是存在的:代码是非常简单的(简单地返回一些像素图以前插入在本地集合),而且与Qt 5.2.1它工作得很好…
我在Ubuntu Linux 12.04 LTS工作…但如果我交叉编译BeagleBone Black/TI AM335x的应用程序,问题也是一样的……所以这似乎不是一个"环境相关"的问题,而是一个Qt问题…
是否有人遇到这样的问题与Qt 5.3.0?有解决方案吗?
我创建了一个非常简单的项目来重现这个问题:它可以在这里找到。
请自己尝试一下,如果你有同样的问题,如果你找到一个有效的解决方案,请告诉我…
Ok,我在Qt bug跟踪器上发布了这个问题,这里是答案:QQmlImageProviderBase
派生的对象必须在堆上分配,因为QQmlEngine
在添加到视图时获得了它的所有权…如果它是在堆栈上分配的,则该对象将被删除两次(一次是由QQmlEngine删除的,另一次是在堆栈弹出时删除的)…
在堆上分配它(按照建议)并让QQmlEngine
自己删除它可以解决这个问题。