2014-09-25 5 views
1

У меня есть следующий трассировки стека на ядре:Qt ядро ​​на QMap :: freeData()

#1 0x..... in raise() 
#2 0x..... in abort() 
#3 0x..... in xehInterpretSavedSigaction() 
#4 0x..... in xehExceptionHandler() 
#5 <signal handler called> 
#6 0x..... in QMap<int, myClass#1>::freeData(QMapData*)() 
#7 0x..... in myClass#2::myClass#2Method() 
#8 0x..... so on and so forth 

Код, который использует QMap выглядит следующим образом:

 foreach (myClass::sturct1 conn, myClass3->getMap()) 
    { 
     if (conn == x) 
     { 
      return conn; 
     } 
    } 

Еогеасп линия где QMap извлекается с помощью метода геттера. Кто-нибудь знает, что делает QMap :: freeData()? Единственными ссылками, которые я могу найти в Интернете, являются фактический источник QMap.h. Похоже, что метод используется в деструкторе QMap. Имя метода приводит меня к мысли, что оно освобождает данные. Во всяком случае, я думаю, что если бы я знал больше о freeData(), я мог бы выяснить и исправить это ядро.

ответ

0

Вам не нужно ничего знать о freeData. Содержимое поля карты в пределах myClass3 повреждено, а getMap() неглубоко копирует экземпляр карты, который был поврежден. freeData работает нормально, пока объект, с которым он работает, не был поврежден ошибочным кодом.

Поскольку вы пытаетесь получить доступ к данным из нескольких потоков, вы должны либо:

  1. в действие от отдельного экземпляра общей структуры данных в каждом потоке. Ключевым моментом является то, что вы должны создать копию в потоке, который «владеет» источником. Затем вы можете передать копию в другой поток и использовать ее там. См., Например, код this answer.

  2. Защитите доступ к структуре данных с помощью мьютекса.

+0

ОК, поэтому я думаю, что получаю. Является ли идея здесь получить доступ к Карте в конце (или начале и конце) каждого метода, и таким образом у меня будет другая трассировка стека, которая поможет мне отследить, где произошла коррупция? Какая польза от .detatch()? – Qman

+0

, по-видимому, мы решаем этот вопрос за прошедший год в ряде мест. Насколько я понимаю, Карта содержит c-структуру, которая не имеет четко определенного деструктора, и как-то мелкая копия этой вещи является проблемой. Мы продолжаем фиксировать эту проблему одним из двух способов. Мы делаем локальную (глубокую) копию карты и перебираем ее. Это один из способов. Другой заключается в изменении цикла foreach, чтобы перебирать map.keys(), тем самым не делая мелкой копии самой карты. Вы когда-нибудь слышали об этом? – Qman

+0

Уверен? Это структура, определенная внутри класса C++. У sturct есть 2 ints, 5 Strings и bool. Вот и все. – Qman

 Смежные вопросы

  • Нет связанных вопросов^_^