Valgrind在QThread::start()上报告内存泄漏

问题描述 投票:1回答:2

问题出在 VMware 上,不知为何 3D 加速会造成内存泄漏和 SIGSEGV,导致程序崩溃。

我在下面的代码中遇到了一个问题。

    gc = new GameController(scene);
    subthread = new QThread(this);
    gc->moveToThread(subthread);
    subthread->start();

这应该是一个普通的子线程初始化,但valgrind内存分析器显示:

416 bytes in 1 blocks are possibly lost in loss record 8,318 of 8,856
  in Widget::Widget(QWidget*) in /home/closer_ex/QtProjects/LifeGameWithTest/LifeGame/widget.cpp:15
  1: calloc in /builddir/build/BUILD/valgrind-3.15.0/coregrind/m_replacemalloc/vg_replace_malloc.c:762
  2: allocate_dtv in /usr/lib64/ld-2.28.so
  3: _dl_allocate_tls in /usr/lib64/ld-2.28.so
  4: pthread_create@@GLIBC_2.2.5 in /usr/lib64/libpthread-2.28.so
  5: QThread::start(QThread::Priority) in /home/closer_ex/Qt5.13.2/5.13.2/gcc_64/lib/libQt5Core.so.5.13.2
  6: Widget::Widget(QWidget*) in /home/closer_ex/QtProjects/LifeGameWithTest/LifeGame/widget.cpp:15
  7: main in /home/closer_ex/QtProjects/LifeGameWithTest/LifeGame/main.cpp:8

直接指向 subthread->start().The scene 不是父线,而是一个QGraphicsScene指针,传递给子线程做一些计算,我手动地 delete gc 在退出()之后&wait() subthread 在我的destructor中。程序运行得很流畅,但我不能因此进行任何内存分析。

如果我检查外部错误,有2个明确的泄漏,导致了 QApplication a(argc, argv);malloc vg_replace_malloc.c "中。

544 bytes in 11 blocks are definitely lost in loss record 8,418 of 8,861
  in _dl_close_worker in /usr/lib64/ld-2.28.so
  1: malloc in /builddir/build/BUILD/valgrind-3.15.0/coregrind/m_replacemalloc/vg_replace_malloc.c:309
  2: _dl_close_worker in /usr/lib64/ld-2.28.so
  3: _dl_close in /usr/lib64/ld-2.28.so
  4: _dl_catch_exception in /usr/lib64/libc-2.28.so
  5: _dl_catch_error in /usr/lib64/libc-2.28.so
  6: _dlerror_run in /usr/lib64/libdl-2.28.so
  7: dlclose in /usr/lib64/libdl-2.28.so
  8: g_module_close in /usr/lib64/libgmodule-2.0.so.0.5600.4
  9: /usr/lib64/libgio-2.0.so.0.5600.4
  10: g_type_module_unuse in /usr/lib64/libgobject-2.0.so.0.5600.4
  11: /usr/lib64/libgio-2.0.so.0.5600.4
  12: g_io_extension_point_get_extensions in /usr/lib64/libgio-2.0.so.0.5600.4
  13: /usr/lib64/libgio-2.0.so.0.5600.4
  14: g_settings_backend_get_default in /usr/lib64/libgio-2.0.so.0.5600.4
  15: /usr/lib64/libgio-2.0.so.0.5600.4
  16: /usr/lib64/libgobject-2.0.so.0.5600.4
  17: g_object_new_valist in /usr/lib64/libgobject-2.0.so.0.5600.4
  18: g_object_new in /usr/lib64/libgobject-2.0.so.0.5600.4
  19: g_settings_new_full in /usr/lib64/libgio-2.0.so.0.5600.4
  20: /usr/lib64/libgdk-3.so.0.2200.30
  21: /usr/lib64/libgdk-3.so.0.2200.30
  22: gdk_display_manager_open_display in /usr/lib64/libgdk-3.so.0.2200.30
  23: gtk_init_check in /usr/lib64/libgtk-3.so.0.2200.30
  24: gtk_init in /usr/lib64/libgtk-3.so.0.2200.30
  25: QGtk3Theme::QGtk3Theme() in /home/closer_ex/Qt5.13.2/5.13.2/gcc_64/plugins/platformthemes/libqgtk3.so

泄漏会发生在哪里?

c++ memory-leaks qt5 valgrind qthread
2个回答
0
投票

你在你的 Qt 应用程序中使用了 GTK+ 风格。在崩溃时的调用堆栈中可以清楚地看到:所有这些符号都包含了以下内容 gtk 中的都是GTK+Qt风格。在大多数情况下,这对剖析或内存泄漏测试来说是个坏消息。

启动你的程序,比如 myprogram -style Fusion - 如此一来 GTK+ 风格不会被使用。

例如,要在valgrind下启动它。

valgrind myprogram -style Fusion

你不会想用你自己的代码来修复GTK和QtGTK的interop层错误吧:)


1
投票

1块中的416个字节可能在丢失记录中丢失了8,856个中的8,318个。

信息是 可能 丢失的这意味着Widget仍然可以到达,这并不是一个明确的内存泄漏,如在 int * x=new int; x = NULL;

你之所以有这样的信息,是因为当你的程序完成后,你没有删除释放所有分配的动态内存,这并不意味着你的程序是错误的。

请看 输得一塌糊涂 块,如果你没有的话,其实都是可以的。对于这一点,你可以使用选项 --show-leak-kinds=definite 这等于说 --show-reachable=no --show-possibly-lost=no

© www.soinside.com 2019 - 2024. All rights reserved.