2013-05-10 2 views
1

У меня есть два структур в моем кодеDeque :: push_back() в C++

struct Node 
{ 
int no; 
Node* next1; 
Node* next2; 
char path1; 
char path2; 
}; 

struct NodeSet 
{ 
Node* entry; 
Node* exit; 
}; 

и Deque как

deque<NodeSet> nsQueue[100] 

Проблема заключается в том, когда бежит к: nsQueue[level+1].push_back(ns) перед выполнением: +

ns {entry=0x0026f5a0 {no=2 next1=0x0026f350 {no=3 next1=0x002999e8 {no=4 next1=0x00299a38 {...} next2=0xcdcdcdcd {...} ...} ...} ...} ...} NodeSet 

после выполнения: +

ns {entry=0x0026f5a0 {no=2 next1=0x0026f350 {no=-858993460 next1=0x00000000 {no=??? next1=??? next2=??? ...} ...} ...} ...} NodeSet 

Почему значения меняются? Спасибо за помощь.

+4

Пожалуйста, покажите нам _code_, который вы используете, предпочтительнее [SSCCE] (http://sscce.org/). –

+1

Почему у вас есть индекс массива после deque? вы уверены, что вам нужно 100 очередей? – Alex

+0

Если вы не хотите показывать больше кода (и, следовательно, сделать это намного сложнее ответить, как мы можем только догадываться), то можете ли вы хотя бы сказать нам, что такое значение 'level', когда это происходит? –

ответ

2

Я подозреваю, что список Node объектов, которые nsNodeSet указал на уже не действует (то есть., Эти объекты не было в живых больше) по какой-то причине, так что память повторного использования в push_back() вызова. Один ключ является то, что вызов push_back() громил памяти, еще один ключ в том, что некоторые из дампа памяти включает в себя:

  • после push_back(): no=-858993460 что эквивалентно no=0xCCCCCCCC. Этот шаблон часто используется компиляторами MS для инициализации автоматических переменных (которые явно не инициализируются кодом) для обнаружения с использованием инициализированных переменных.

Кроме того, перед push_back() дамп показывает, что next2=0xcdcdcdcd. Этот шаблон используется средой кучи отладки для заполнения «чистой памяти», которая указывает память, которая была выделена, но не была записана приложением с момента размещения. Это может быть не ошибка (вполне допустимо не записывать в выделенную память, если вы ее иначе не используете), но это указывает на то, что хотя бы некоторые из объектов в списке структур Node могут быть не совсем правильно.

+0

Да, я просто хочу знать, почему после push_back "next1 = 0x0026f350 {no = 3 next1 = 0x002999e8" становится "next1 = 0x0026f350 {no = -858993460 next1 = 0x00000000". Вы отмечаете, что «no = -858993460» часто используется компиляторами MS для инициализации автоматических переменных, но я не объявляю здесь новую переменную. – user2289677

+0

@ user2289677: если память, используемая 'Node' в' 0x0026f350', уже недействительна, то она должна быть переназначена для других целей - возможно, локальной переменной в 'push_back()', которая никогда не используется? Без SSCCE, как просил Йоахим, я просто делаю некоторые образованные догадки, основанные на крошечной информации о состоянии объектов, заданных в вопросе, - нет абсолютно никакой информации о том, как создается список «Node». Но на основе вывода отладчика я могу догадаться, что по крайней мере некоторые из объектов в этом списке мертвы. –

+0

Большое спасибо, я нашел причину. Вы правы, создайте узел новым, можете исправить его. Еще раз спасибо. – user2289677

4

Потому что я уверен, вы не звонили begin() и end() снова после вызова push_back()

Deque аннулирует его итераторы после вызова push_back()

Why does push_back or push_front invalidate a deque's iterators?

Но и я не могу доказать, что без видя ваш код.

Редактировать: Или вы делаете что-то странное, потому что у вас есть 100 очередей, которые не делают то, что вы думаете о его работе.

+1

Может показаться странным, что у меня есть 100 очередей – user2289677

+0

@ user2289677: в основном странно, что у вас есть массив требований NodeSet (собственная реализация контейнера). Но опять же, это может быть правильным решением для ваших нужд. – stefaanv

+0

Я установил некоторые заполнители в другом месте, поэтому мне нужно записать голову и хвост списка в порядке. – user2289677

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