Как отладить и исправить эту проблему двойного свободного повреждения памяти для конкретного случая - PullRequest
0 голосов
/ 02 ноября 2018

При выходе из инструмента у меня появляется графический интерфейс на основе QT, я получаю следующую проблему

*** 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    

Мне нужны входные данные для устранения этой проблемы. Я также не могу использовать Valgrind. Вылетает до этого случая

1 Ответ

0 голосов
/ 02 ноября 2018

Один из ваших удаленных или бесплатных вызовов выполняется на уже освобожденной памяти. Просмотрите все ваши ручные освобождения памяти и проверьте, верны ли они (удалите подозрительные и посмотрите, не изменит ли это поведение).

В идеале, при использовании современного C ++ у вас должна быть небольшая потребность в явном создании новых и удалении или вообще не нужно их использовать (используйте стандартные указатели, предоставляемые std).

Относительно Qt, знайте, что Qt использует родительское дочернее владение. Вы должны удалять только «верхние» объекты (те, у которых нет «родительского» набора), Qt удалит все дочерние объекты удаленного объекта самостоятельно. то есть, если вы вручную разместили производный экземпляр QObject и каким-то образом связали его в иерархию QObject (добавьте дочерний элемент / установите родителя / и т. д.), непосредственное удаление этого объекта вызовет проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...