【发布时间】:2020-06-02 16:03:45
【问题描述】:
问题出在 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()。
scene 不是父级,而是一个 QGraphicsScene 指针传递给在子线程中进行一些计算,我在我的析构函数中在 quit()&wait() subthread 之后手动 delete gc。程序运行顺利,但我无法进行任何内存分析。
如果我检查外部错误,肯定有 2 个泄漏,导致“vg_replace_malloc.c”中的 QApplication a(argc, argv); 和 malloc。
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
泄漏可能发生在哪里?
【问题讨论】:
-
我不知道,但我的猜测是
GameController对象并不拥有您提供给moveToThread的线程对象的所有权,所以您仍然必须拥有delete subthread;。 -
widget.cpp:15 中的代码行是什么?
-
@OznOg 正如我的标题所说,它是
subthread->start(); -
线程退出前是否加入?
-
@FredLarson
subthread已经有了一个父对象,this指向主窗口对象。
标签: c++ memory-leaks qt5 valgrind qthread