1

我的代码中有两个结构

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

为什么价值观会改变?感谢帮助。

4

2 回答 2

4

因为我敢打赌你没有跟注begin()end()然后又跟注push_back()

deque 在调用后使其迭代器无效push_back()

为什么 push_back 或 push_front 使双端队列的迭代器无效?

但如果没有看到您的代码,我也无法证明这一点。

编辑:或者你正在做一些奇怪的事情,因为你有 100 个队列,这并没有按照你的想法做。

于 2013-05-10T06:38:48.753 回答
2

我怀疑由于某种原因,指向的Node对象列表ns NodeSet不再有效(即那些对象不再存在),因此push_back()调用正在重用内存。一个线索是调用push_back()破坏了内存,另一个线索是一些内存转储包括:

  • push_back():之后no=-858993460相当于no=0xCCCCCCCC. MS 编译器经常使用该模式来初始化自动变量(未由代码显式初始化),以帮助检测使用初始化变量。

此外,在 之前push_back(),转储显示next2=0xcdcdcdcd. 调试堆运行时使用该模式来填充“干净内存”,这表明自分配以来已分配但未由应用程序写入的内存。这可能不是一个错误(不写入分配的内存是完全有效的,只要您不使用它),但这表明Node结构列表中的至少一些对象可能不太正确.

于 2013-05-10T07:14:02.983 回答