2013-05-10 59 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