在c ++中使用deque :: push_back()

时间:2013-05-10 06:24:37

标签: c++ struct deque

我的代码中有两个结构

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

为什么值会改变?谢谢你的帮助。

2 个答案:

答案 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列表中至少有一些对象结构化了可能不太对劲。

相关问题