我的代码中有两个结构
struct Node
{
int no;
Node* next1;
Node* next2;
char path1;
char path2;
};
struct NodeSet
{
Node* entry;
Node* exit;
};
和像
一样的双端队列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
为什么值会改变?谢谢你的帮助。
答案 0 :(得分:4)
因为我打赌你打电话给begin()
end()
和push_back()
打电话
调用push_back()
后,deque使其迭代器无效
Why does push_back or push_front invalidate a deque's iterators?
但是,如果没有看到您的代码,我也无法证明这一点。
编辑:或者你做了一些奇怪的事情,因为你有100个队列,这不符合你的想法。
答案 1 :(得分:2)
我怀疑Node
ns
指向的NodeSet
个对象的列表由于某种原因不再有效(即,那些对象不再存在),所以push_back()
调用正在重用内存。一个线索是对push_back()
的调用破坏了内存,另一个线索是一些内存转储包括:
push_back()
:no=-858993460
之后,相当于no=0xCCCCCCCC
。 MS编译器经常使用该模式初始化自动变量(未通过代码显式初始化)以帮助检测使用初始化变量。此外,在push_back()
之前,转储显示next2=0xcdcdcdcd
。调试堆运行时使用该模式来填充“清理内存”,该内存指示自分配以来应用程序已分配但未写入的内存。这可能不是一个错误(只要你不使用它就不能写入分配的内存是完全有效的),但这表明Node
列表中至少有一些对象结构化了可能不太对劲。