*** Обнаружена glibc *** двойное освобождение или повреждение (fasttop):

Вызов очистки QByteArray генерирует следующее исключение:

* обнаружен glibc * / home / yan / FPS2 / FPS2: двойное освобождение или повреждение (fasttop):

0 ?? 1 ??
2 бесплатных
3 QByteArray :: clear ()
4 FPSengine :: getDatagrams
5 FPSengine :: xmitData
6 FPSengine :: getData
7 threadDatalog :: run
8 ??
9 start_thread
10 клон
11 ?? 0

это ошибка qt или это может иметь какое-то отношение к моему коду? Я знаю, что QObjects не являются потокобезопасными (определение QT - это не несколько потоков, вызывающих одну и ту же функцию одного и того же экземпляра объекта), но моя функция имеет мьютексы. Также я очень редко получаю эту ошибку, хотя одна и та же функция вызывается часто. P.S. Способ предотвратить это - env ​​var MALLOC_CHECK_ 0

этот URL связан с аналогичной проблемой, и некоторые сообщения, кажется, подразумевают, что это вызвано несовместимой версией glibc.

*** Обнаружен glibc *** perl: double free или коррупция (! предыдущая): 0x0c2b7138 ***


person yan bellavance    schedule 04.02.2010    source источник
comment
Последние три заданных вами вопроса кажутся симптомами неправильной синхронизации между потоками. Я не думаю, что ваш класс FPSengine является потокобезопасным, но все еще недостаточно информации, чтобы дать ответ.   -  person rpg    schedule 04.02.2010
comment
хорошо, я сделал тест, включив только один из qthreads, и, конечно, mainthread всегда там. Кроме того, основной поток ничего не делал, а функция, вызываемая из qthread, имеет блокировку мьютекса на первой инструкции и разблокировку на последней инструкции. Из того, что я вижу, читая код QByteArray.cpp и документацию Qt о неявно разделяемых классах, это кажется проблемой разыменования. Теперь я пытаюсь увидеть, как в нем задействована синхронизация потоков.   -  person yan bellavance    schedule 04.02.2010
comment
Возможный дубликат Как отследить двойное освобождение или повреждение ошибка   -  person Raedwald    schedule 06.12.2018


Ответы (3)


Это может быть множество разных вещей, включая ссылку на временный QByteArray, возвращаемый вызовом функции, но маловероятно (IMO), чтобы быть ошибкой в ​​Qt.

Вот несколько мыслей по отладке:

  • запустите его под Valgrind и посмотрите, выделит ли он проблему
  • запустите ваше приложение с версией Qt, для которой доступны символы отладки
  • включите дампы ядра и посмотрите, получите ли вы файл ядра
person Kaleb Pederson    schedule 04.02.2010

это вызвано тем фактом, что приложение является многопоточным, объект принадлежит к основному потоку, но используется в другом потоке, хотя я использовал мьютексы в QBytearray, UDPsocket, который использует его для выполнения readDatagram, также находится в основном потоке ... и да, мне нужно, чтобы udpSocket был в основном потоке

person yan bellavance    schedule 26.02.2010

Я очень сомневаюсь, что вы нашли ошибку в qt. Эта ошибка может возникать по ряду причин, но существенная означает, что у вас есть ссылка на уже освобожденную память. Запустите отладчики и попытайтесь выяснить, что вызывает проблему. Используйте gdb и valgrind, и, надеюсь, вы сможете отследить проблему.

person captncraig    schedule 04.02.2010