如何针对特定情况调试和修复此双自由内存损坏问题
How to debug and fix this double free memory corruption issue for specific case
当我退出该工具时,我有一个基于QT的GUI,我得到以下问题
*** glibc detected *** /bin/linux_x86_64/main-g: double free or corruption
(!prev): 0x00000000049eca50 ***
======= Backtrace: =========
/lib64/libc.so.6[0x3feee75e66]
/lib64/libc.so.6[0x3feee789b3]
/linux_x86_64/main2-
g(_ZN9__gnu_cxx13new_allocatorIPN3zi_14PCommandEE10deallocateEPS3_m+0x20)
[0x1d9f504]
gui//../bin/linux_x86_64/main2-g
_ZNSt16allocator_traitsISaIPN3zi_14PCommandEEE10deallocateERS3_PS2_m+0x2b)
[0x1d9f0de]
/gui//../bin/linux_x86_64/main2-g
(_ZNSt12_Vector_baseIPN3zi_14PCommandESaIS2_EE13_M_deallocateEPS2_m+0x32)
[0x1d9eba6]
/gui//../bin/linux_x86_64/main2-
g(_ZNSt12_Vector_baseIPN3zi_14PCommandESaIS2_EED2Ev+0x41)[0x1d9e955]
../bin/linux_x86_64/main2-g(_ZNSt6vectorIPN3zi_14PCommandESaIS2_EED1Ev+0x41)
[0x1dc771b]
/lib64/libc.so.6(__cxa_finalize+0x9d)[0x3feee35ebd]
../lib/linux_x86_64/lib-g.so(+0x3a627c6)[0x7f63
====== Memory map: ========
00400000-02b5f000 r-xp 00000000 08:03 21767481
../main2-g
02d5e000-02f8c000 rw-p 0275e000 08:03 21767481
../main2-g
02f8c000-03222000 rw-p 00000000 00:00 0
03cc7000-04cac000 rw-p 00000000 00:00 0
我需要一些输入来调试这个问题。我也不能使用金刚砂。它在这种情况下崩溃
您的一个删除或释放调用是在已经释放的内存上完成的。仔细检查所有手动内存分配,检查它们是否正确(删除可疑的内存分配,看看它是否会改变行为(。
理想情况下,使用现代C++,您应该很少或不需要显式的new和delete(使用std提供的智能指针(。
关于Qt,请注意Qt使用父母-子女所有权。您应该只删除"顶部"对象(没有"父对象"集的对象(,Qt将单独删除已删除对象的所有子对象。即,如果您手动分配了一个QObject派生实例,并以某种方式将其链接到QObject层次结构中(添加子对象/设置父对象等(,则直接删除该对象会造成麻烦。
相关文章:
- 将字符串存储在c++中的稳定内存中
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- Win32编译器选项和内存分配
- 当vector是tje全局变量时,c++中vector的内存管理
- 带内存和隔离功能的SQLite
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 迭代时从向量和内存中删除对象
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 为什么示例代码访问IUnknown中已删除的内存
- 如何在C++类内存结构中创建"spacer"?
- 如何针对特定情况调试和修复此双自由内存损坏问题
- Valgrind 声称内存释放中的自由空间太多
- 我是否必须在C 接口的OPENCV C包装器中自由分配的内存
- C++内存分配/释放和自由空间错误
- 如何释放 C++/C 格式的内存?我什么时候会写自由(a);?函数是重新指针
- 双自由,没有任何动态内存分配
- 如何正确使用malloc和自由内存
- 使用内存复制对象时出现双自由或损坏错误