2013-05-10 69 views
1

我有我的代碼雙端隊列::的push_back()在C++中

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

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

兩個結構和像

deque<NodeSet> nsQueue[100] 

一個deque的問題是,當運行到: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/)。 – 2013-05-10 06:25:48

+1

爲什麼在deque之後有一個數組下標?你確定你需要100個隊列嗎? – Alex 2013-05-10 06:37:23

+0

如果你不想再顯示任何代碼(因此我們只能猜測這會讓答案更加難以回答),那麼你至少能告訴我們什麼時候會發生「級別」的值? – 2013-05-10 07:31:45

回答

2

我懷疑Node對象的nsNodeSet指着名單不再有效(即,這些對象沒有活了)由於某種原因,所以內存是由push_back()通話重用。一條線索是,調用push_back()搗毀了內存,另一條線索是,一些內存轉儲包括:no=-858993460這相當於no=0xCCCCCCCC

    push_back()
  • 。 MS編譯器經常使用該模式來初始化自動變量(未由代碼明確初始化)以幫助檢測使用初始化變量。

另外,在push_back()之前,轉儲顯示next2=0xcdcdcdcd。調試堆運行時使用該模式來填充「清理內存」,該內存指示自分配以來已分配但未由應用程序寫入的內存。這可能不是一個錯誤(只要不另外使用它,它就不會寫入分配的內存是完全有效的),但這表明至少有一些Node結構列表中的某些對象可能不完全對。

+0

是的,我只是想知道爲什麼在push_back「next1 = 0x0026f350 {no = 3 next1 = 0x002999e8」變成「next1 = 0x0026f350 {no = -858993460 next1 = 0x00000000」之後。你提到MS編譯器經常使用「no = -858993460」來初始化自動變量,但是我沒有在這裏聲明一個新的變量。 – user2289677 2013-05-10 07:28:02

+0

@ user2289677:如果'0x0026f350'處的'Node'使用的內存不再有效,那麼它將被重新用於其他用途 - 可能是'push_back()'中的一個永遠不會被使用的局部變量?沒有Joachim要求的SSCCE,我只是根據問題中提供的關於對象狀態的微小信息進行一些教育猜測 - 關於如何創建「Node」列表絕對沒有任何信息。但基於調試器輸出,我可以猜測至少有一些列表上的對象已經死亡。 – 2013-05-10 07:42:45

+0

非常感謝,我找到了原因。你是對的,用new創建Node可以修復它。再次感謝。 – user2289677 2013-05-10 08:07:44

4

因爲我敢打賭,你叫push_back()

雙端隊列後再次沒叫begin()end()調用push_back()

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

後的迭代器失效,但我也不能證明沒有看你的代碼。

編輯:或者你正在做一些奇怪的事情,因爲你有100個隊列,這是不是做了什麼,你認爲它做的事情。

+1

奇怪的是我有100個隊列 – user2289677 2013-05-10 06:57:54

+0

@ user2289677:你有一個NodeSet的deques數組(自己實現一個容器)是很奇怪的。但是,再一次,它可能是您的需求的正確解決方案。 – stefaanv 2013-05-10 07:38:34

+0

我在其他地方設置了一些佔位符,所以我必須按順序記錄列表的頭部和尾部。 – user2289677 2013-05-10 07:43:14