Я написал проект на C ++ и QML и попытался исследовать утечки памяти с помощью Valgrind, но он показывает большое количество ошибок, даже если приложение является самым простым из возможных:
#include <QtGui/QApplication>
#include "qmlapplicationviewer.h"Q_DECL_EXPORT int main(int argc, char *argv[])
{
QScopedPointer<QApplication> app(createApplication(argc, argv));
QScopedPointer<QmlApplicationViewer> viewer(QmlApplicationViewer::create());
viewer->setOrientation(QmlApplicationViewer::ScreenOrientationAuto);
viewer->setMainQmlFile(QLatin1String("qml/Interface/main2.qml"));
viewer->showExpanded();
return app->exec();
}
QML-файл:
import QtQuick 1.0
Rectangle {
width: 800
height: 480
color: "blue"MouseArea {
anchors.fill: parent
onClicked: Qt.quit()
}
}
Я запускаю Valgrind с помощью команды:
valgrind -v --leak-check=full --show-reachable=yes --track-origins=yes --log-file=Interface2.valgrind.log ./Interface2
Резюме Valgrind гласит:
==16840== LEAK SUMMARY:
==16840== definitely lost: 344 bytes in 2 blocks
==16840== indirectly lost: 20 bytes in 1 blocks
==16840== possibly lost: 9,935 bytes in 308 blocks
==16840== still reachable: 133,085 bytes in 2,234 blocks
==16840== suppressed: 0 bytes in 0 blocks
Ниже приведены несколько (около 3000 строк журнала) сообщений, полученных от Valgrind:
==16840== Memcheck, a memory error detector
==16840== Copyright (C) 2002-2009, and GNU GPL'd, by Julian Seward et al.
==16840== Using Valgrind-3.6.0.SVN-Debian and LibVEX; rerun with -h for copyright info
==16840== Command: ./Interface2
==16840== Parent PID: 13367
==16840==
--16840--
--16840-- Valgrind options:
--16840-- --suppressions=/usr/lib/valgrind/debian-libc6-dbg.supp
--16840-- -v
--16840-- --leak-check=full
--16840-- --show-reachable=yes
--16840-- --track-origins=yes
--16840-- --log-file=Interface2.valgrind.log
--16840-- Contents of /proc/version:
--16840-- Linux version 2.6.32-43-generic (buildd@roseapple) (gcc version 4.4.3 (Ubuntu 4.4.3-4ubuntu5.1) ) #97-Ubuntu SMP Wed Sep 5 16:43:09 UTC 2012
--16840-- Arch and hwcaps: X86, x86-sse1-sse2
--16840-- Page sizes: currently 4096, max supported 4096
--16840-- Valgrind library directory: /usr/lib/valgrind
--16840-- Reading syms from /lib/ld-2.11.1.so (0x4000000)
--16840-- Reading debug info from /lib/ld-2.11.1.so ..
--16840-- .. CRC mismatch (computed 1f70923a wanted 671e42e8)
--16840-- Reading debug info from /usr/lib/debug/lib/ld-2.11.1.so ..
--16840-- Reading syms from /root/workspace/CC5/AIO_CC5/Tools/Interface/Interface2 (0x8048000)
--16840-- Reading syms from /usr/lib/valgrind/memcheck-x86-linux (0x38000000)
--16840-- object doesn't have a dynamic symbol table
--16840-- Reading suppressions file: /usr/lib/valgrind/debian-libc6-dbg.supp
--16840-- Reading suppressions file: /usr/lib/valgrind/default.supp
--16840-- REDIR: 0x4016100 (index) redirected to 0x3803e9b3 (vgPlain_x86_linux_REDIR_FOR_index)
--16840-- Reading syms from /usr/lib/valgrind/vgpreload_core-x86-linux.so (0x401f000)
--16840-- Reading syms from /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so (0x4022000)
==16840== 148 (128 direct, 20 indirect) bytes in 1 blocks are definitely lost in loss record 133 of 200
==16840== at 0x4024F20: malloc (vg_replace_malloc.c:236)
==16840== by 0x60438C1: ??? (in /usr/lib/libfontconfig.so.1.4.4)
==16840== by 0x60443C4: ??? (in /usr/lib/libfontconfig.so.1.4.4)
==16840== by 0x60444D9: ??? (in /usr/lib/libfontconfig.so.1.4.4)
==16840== by 0x6048876: ??? (in /usr/lib/libfontconfig.so.1.4.4)
==16840== by 0x60493C0: ??? (in /usr/lib/libfontconfig.so.1.4.4)
==16840== by 0x61CACFD: ??? (in /lib/libexpat.so.1.5.2)
==16840== by 0x61CBBC0: ??? (in /lib/libexpat.so.1.5.2)
==16840== by 0x61CD412: ??? (in /lib/libexpat.so.1.5.2)
==16840== by 0x61CDCD9: ??? (in /lib/libexpat.so.1.5.2)
==16840== by 0x61C6F02: XML_ParseBuffer (in /lib/libexpat.so.1.5.2)
==16840== by 0x604724A: FcConfigParseAndLoad (in /usr/lib/libfontconfig.so.1.4.4)==16840== 216 bytes in 1 blocks are definitely lost in loss record 137 of 200
==16840== at 0x4024F20: malloc (vg_replace_malloc.c:236)
==16840== by 0x60CE9D2: _XimOpenIM (in /usr/lib/libX11.so.6.3.0)
==16840== by 0x60CE817: _XimRegisterIMInstantiateCallback (in /usr/lib/libX11.so.6.3.0)
==16840== by 0x60B1D77: XRegisterIMInstantiateCallback (in /usr/lib/libX11.so.6.3.0)
==16840== by 0x4BF6A51: ??? (in /opt/QtSDK/Desktop/Qt/474/gcc/lib/libQtGui.so.4.7.4)
==16840== by 0x4BF4500: QInputContextFactory::create(QString const&, QObject*) (in /opt/QtSDK/Desktop/Qt/474/gcc/lib/libQtGui.so.4.7.4)
==16840== by 0x4551C2C: QApplication::inputContext() const (in /opt/QtSDK/Desktop/Qt/474/gcc/lib/libQtGui.so.4.7.4)
==16840== by 0x459DEA6: QWidgetPrivate::inputContext() const (in /opt/QtSDK/Desktop/Qt/474/gcc/lib/libQtGui.so.4.7.4)
==16840== by 0x45A9E03: QWidget::setAttribute(Qt::WidgetAttribute, bool) (in /opt/QtSDK/Desktop/Qt/474/gcc/lib/libQtGui.so.4.7.4)
==16840== by 0x4C65E0B: QGraphicsViewPrivate::updateInputMethodSensitivity() (in /opt/QtSDK/Desktop/Qt/474/gcc/lib/libQtGui.so.4.7.4)
==16840== by 0x4C7185E: QGraphicsView::setScene(QGraphicsScene*) (in /opt/QtSDK/Desktop/Qt/474/gcc/lib/libQtGui.so.4.7.4)
==16840== by 0x40A5A06: ??? (in /opt/QtSDK/Desktop/Qt/474/gcc/lib/libQtDeclarative.so.4.7.4)==16840== 256 bytes in 1 blocks are still reachable in loss record 143 of 200
==16840== at 0x4025016: realloc (vg_replace_malloc.c:525)
==16840== by 0x602ED60: FcBlanksAdd (in /usr/lib/libfontconfig.so.1.4.4)
==16840== by 0x60495CB: ??? (in /usr/lib/libfontconfig.so.1.4.4)
==16840== by 0x61CACFD: ??? (in /lib/libexpat.so.1.5.2)
==16840== by 0x61CBBC0: ??? (in /lib/libexpat.so.1.5.2)
==16840== by 0x61CD412: ??? (in /lib/libexpat.so.1.5.2)
==16840== by 0x61CDCD9: ??? (in /lib/libexpat.so.1.5.2)
==16840== by 0x61C6F02: XML_ParseBuffer (in /lib/libexpat.so.1.5.2)
==16840== by 0x604724A: FcConfigParseAndLoad (in /usr/lib/libfontconfig.so.1.4.4)
==16840== by 0x603D091: FcInitLoadConfig (in /usr/lib/libfontconfig.so.1.4.4)
==16840== by 0x603D19B: FcInitLoadConfigAndFonts (in /usr/lib/libfontconfig.so.1.4.4)
==16840== by 0x603D29C: FcInit (in /usr/lib/libfontconfig.so.1.4.4)==16840== 360 bytes in 3 blocks are possibly lost in loss record 144 of 200
==16840== at 0x4024106: memalign (vg_replace_malloc.c:581)
==16840== by 0x4024163: posix_memalign (vg_replace_malloc.c:709)
==16840== by 0x5E9C9C1: slab_allocator_alloc_chunk (gslice.c:1148)
==16840== by 0x5E9D222: g_slice_alloc (gslice.c:678)
==16840== by 0x5E9E881: g_slist_prepend (gslist.c:273)
==16840== by 0x5EA1A94: g_strsplit (gstrfuncs.c:2431)
==16840== by 0x5EB5731: g_get_language_names (gutils.c:3169)
==16840== by 0x5EA9B49: g_thread_init_glib (gthread.c:940)
==16840== by 0x5E3F69D: g_thread_init (gthread-impl.c:360)
==16840== by 0x50FC7D9: QEventDispatcherGlibPrivate::QEventDispatcherGlibPrivate(_GMainContext*) (in /opt/QtSDK/Desktop/Qt/474/gcc/lib/libQtCore.so.4.7.4)
==16840== by 0x460CB4C: ??? (in /opt/QtSDK/Desktop/Qt/474/gcc/lib/libQtGui.so.4.7.4)
==16840== by 0x460CC32: ??? (in /opt/QtSDK/Desktop/Qt/474/gcc/lib/libQtGui.so.4.7.4)==16840== 16,352 bytes in 2 blocks are still reachable in loss record 199 of 200
==16840== at 0x4024F20: malloc (vg_replace_malloc.c:236)
==16840== by 0x6098833: ??? (in /usr/lib/libX11.so.6.3.0)
==16840== by 0x6098CA6: _XrmInternalStringToQuark (in /usr/lib/libX11.so.6.3.0)
==16840== by 0x609F4C5: XStringToKeysym (in /usr/lib/libX11.so.6.3.0)
==16840== by 0x60D2849: _XimParseStringFile (in /usr/lib/libX11.so.6.3.0)
==16840== by 0x60D0466: _XimLocalOpenIM (in /usr/lib/libX11.so.6.3.0)
==16840== by 0x60CEB3C: _XimOpenIM (in /usr/lib/libX11.so.6.3.0)
==16840== by 0x60CE817: _XimRegisterIMInstantiateCallback (in /usr/lib/libX11.so.6.3.0)
==16840== by 0x60B1D77: XRegisterIMInstantiateCallback (in /usr/lib/libX11.so.6.3.0)
==16840== by 0x4BF6A51: ??? (in /opt/QtSDK/Desktop/Qt/474/gcc/lib/libQtGui.so.4.7.4)
==16840== by 0x4BF4500: QInputContextFactory::create(QString const&, QObject*) (in /opt/QtSDK/Desktop/Qt/474/gcc/lib/libQtGui.so.4.7.4)
==16840== by 0x4551C2C: QApplication::inputContext() const (in /opt/QtSDK/Desktop/Qt/474/gcc/lib/libQtGui.so.4.7.4)
Вопрос в том, что мне нужно сделать, чтобы избавиться от ошибок утечки памяти из приложения. Это вопрос глючных библиотек? Я установил его с помощью установщика с официального сайта Qt.
Благодарю.
Кажется, дело в глючных библиотеках, да. Если вы думаете, что можете отследить это до утечек в Qt, я определенно сообщу об этом как об ошибке с ними: http://qt-project.org/wiki/ReportingBugsInQt
Тем не менее, я думаю, что вы используете QScopedPointer довольно любопытно. Почему бы просто не разместить ваше приложение в стеке? Как это:
QApplication app(argc, argv);
Я бы сказал то же самое для вашего указателя QmlApplicationViewer, но я не вижу, что делает QmlApplicationViewer :: create () 🙂
Во всяком случае, я не думаю, что это может решить утечки для вас …
Других решений пока нет …