2013-03-30 2 views
0

Я застрял на этом очень долго. мои коды большие, я стараюсь изо всех сил абстрагировать проблемные коды.unordered_map, отображаемое значение изменяется автоматически, сигнал SIGSEGV получен. Описание: Ошибка сегментации

Я программирую на C++, я использую unordered_map для хранения нескольких переменных.

class INFO 
    {int interestingInfo1; 
    double interestingInfo2;} 
INFO *info; 
typedef std::tr1::unordered_map<index,Info*,hashIndex> newMap; 

line1:newMap myMap; 
line2:myMap[index]=info; 
line3:myMap[index]->interestedInfo1; 

В моей программе, каждый объект будет доступен несколько раз, в первом круге доступа, unordered_map работает хорошо, я могу принести заинтересованный информацию, на который указывает Info, но когда тот же объект доступен во втором раунд, строка 3 вызывает интригующие ошибки Segmentation fault.

я распечатать элементы в MyMap, в том числе index и адрес interestedInfo указываемой Info (или сказать, стоимость самого Info),

index1 0x9765ad8 
... 

во втором времени доступа, распечатайте то же содержание:

index1 0x98ba128 
...... 

значение указателя Info изменяется! Я предполагаю, что это изменение приводит к сбою line3,

Теперь я уверен, что ничего не сделал для myMap, но почему изменился указатель как элемент?

Пожалуйста, помогите! Большое спасибо!

+0

Поместите точки перетаскивания данных в стратегическую точку вашего кода, чтобы узнать, кто является виновником, который приводит к переполнению памяти. –

+0

@ShmilTheCat благодарит за ответ, я установил контрольные точки, я уверен, что строка 3 является ответчиком. Я просто не знаю, как справиться со странным изменением значения указателя в unordered_map. – ulyssis2

+0

Это только я, или линия 2 подозревается? Вы фактически передаете строку в 'insert()'? Я думаю, вы хотите передать либо пару или список инициализаторов. –

ответ

0

Я думаю, что ваш пользовательский алгоритм хэширования может быть подозрительным. Я предполагаю, что что-то заставляет его давать разные результаты в разное время, когда вы обращаетесь к нему (возможно, вы что-то изменили между ними?), Так что, когда вы обращаетесь к нему по этому ключу, он больше не дает то же значение - или любое значение, следовательно, ошибка сегментации.

+0

индексы элементов в newMap различаются (они acutally IPV4Address), хэш-функция возвращает адрес как int. поэтому я думаю, что невозможно создать идентичное значение для разных значений ключа. – ulyssis2