Valgrind 在 QThread::start() 上报告内存泄漏
Valgrind reports memory leak on QThread::start()
问题出在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
泄漏可能发生在哪里?
1 个块中的 416 个字节可能会丢失 丢失记录中的 8,318 个,共 8,856
个
消息可能丢失,这意味着小部件仍然可以访问,这不是像int * x=new int; x = NULL;
那样的明确内存泄漏
您有该消息是因为当您的程序完成时,您没有删除/释放所有分配的动态内存,这并不意味着您的程序是错误的。
看看绝对丢失的块,如果你没有一切都可以。为此,您可以使用选项--show-leak-kinds=definite
,这相当于执行--show-reachable=no --show-possibly-lost=no
你在Qt应用程序中使用了GTK+风格。这在崩溃的调用堆栈中清晰可见:所有包含gtk
的符号都是 GTK+ Qt 样式。在大多数情况下,就分析或内存泄漏测试而言,这是个坏消息。
像myprogram -style Fusion
一样启动程序 - 这样就不会使用GTK+
样式。
例如,要在瓦尔格林德下启动它:
valgrind myprogram -style Fusion
您不想修复 GTK 和 Qt/GTK 互操作层错误以及您自己的代码:)
- 为什么cudaMemGetInfo报告设备内存总量的变化
- 为什么瓦尔格林德在不释放恶意内存后没有报告任何问题?
- 内存清理程序报告全局对象构造中未初始化值的使用
- Valgrind 在 QThread::start() 上报告内存泄漏
- 我是否访问了已释放的内存,或者在这种情况下DrMemory报告不正确?
- 为什么 valgrind 报告两个内存分配,而我的代码只请求一个?
- Clang++ 6.0 内存清理器未报告返回值指示条件分支的函数中的未初始化局部变量
- 为什么 Valgrind 在此实现中报告内存泄漏?
- 为什么Linux报告了我的应用程序的内存使用情况
- 瓦尔格林德在组成中报告的内存泄漏
- 如何修复Valgrind报告的C 数组驱动器中的内存泄漏
- clang 内存消毒剂报告使用非处方化值
- Valgrind在定义字符*数组时报告内存泄漏
- 可以valgrind报告丢失块的内存地址(用于调试递归函数调用)
- 瓦尔格林德报告内存泄漏,但我不明白它发生在哪里
- 程序的内存使用量随着时间的推移而增加,但内存泄漏工具报告没有问题
- Valgrind 报告了许多在运行之间更改的地方的内存泄漏
- 我的 MFC 应用中报告了错误的内存泄漏
- 在OSX上,Valgrind报告了内存泄漏,它来自哪里
- 如何使用 DrMemory 在 C++ 中显示和报告内存泄漏