C++ c+中的push#u back()+;
我的代码中有两个结构C++ c+中的push#u back()+;,c++,struct,deque,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] 执行后:+ ns {entry=0x0026f5a0 {no=2 next1=0x0026f350 {no=-858993460 next1
struct Node
{
int no;
Node* next1;
Node* next2;
char path1;
char path2;
};
struct NodeSet
{
Node* entry;
Node* exit;
};
还有一个像戴克一样的
deque<NodeSet> nsQueue[100]
执行后:+
ns {entry=0x0026f5a0 {no=2 next1=0x0026f350 {no=-858993460 next1=0x00000000 {no=??? next1=??? next2=??? ...} ...} ...} ...} NodeSet
为什么价值观会改变?谢谢您的帮助。因为我敢打赌,您在调用
push_back()
后,没有再次调用begin()
和end()
deque在调用push\u back()
但我也不能证明这一点,除非看到你的代码
编辑:或者你正在做一些奇怪的事情,因为你有100个队列,它们没有做你认为它在做的事情。因为我敢打赌你在调用
后没有再次调用begin()
和end()
deque在调用push\u back()
但我也不能证明这一点,除非看到你的代码
编辑:或者你正在做一些奇怪的事情,因为你有100个队列,它们没有做你认为它在做的事情。我怀疑ns
节点集
指向的节点对象列表出于某种原因不再有效(即,这些对象不再是活动的),因此,push\u back()
调用正在重用内存。一个线索是对push_back()
的调用破坏了内存,另一个线索是一些内存转储包括:
- 在
push_back()
:no=-858993460
之后,这相当于no=0xcccc
。MS编译器经常使用该模式初始化自动变量(不是由代码显式初始化的),以帮助检测是否使用了已初始化的变量
另外,在push_back()
之前,转储显示next2=0xcdcdcdcd
。调试堆运行时使用该模式填充“干净内存”,这表示自分配后应用程序已分配但未写入的内存。这可能不是一个bug(不写入分配的内存是完全有效的,只要您不使用它),但这表明,节点
结构列表中至少有一些对象可能不太正确。我怀疑节点集
指向的节点
对象列表由于某种原因不再有效(即,这些对象不再处于活动状态),因此,push\u back()
调用正在重用内存。一个线索是对push_back()
的调用破坏了内存,另一个线索是一些内存转储包括:
- 在
push_back()
:no=-858993460
之后,这相当于no=0xcccc
。MS编译器经常使用该模式初始化自动变量(不是由代码显式初始化的),以帮助检测是否使用了已初始化的变量
另外,在push_back()
之前,转储显示next2=0xcdcdcdcd
。调试堆运行时使用该模式填充“干净内存”,这表示自分配后应用程序已分配但未写入的内存。这可能不是一个bug(不写入分配的内存是完全有效的,只要您不使用它),但这表明节点
结构列表中至少有一些对象可能不太正确。请向我们展示您使用的代码,最好是一个。为什么在deque之后有一个数组下标?你确定你需要100个队列吗?如果你不想再显示任何代码(因此我们只能猜测,这会使回答更加困难),那么你能至少告诉我们发生这种情况时level
的值是多少吗?level只是一个整数,这里是0。请向我们显示你使用的代码,最好是一个。为什么在deque后面有一个数组下标?你确定需要100个队列吗?如果你不想再显示任何代码(因此我们只能猜测,这会使回答变得更加困难),那么你能至少告诉我们发生这种情况时level
的值是多少吗?level只是一个整数,这里是0。我有100可能很奇怪queues@user2289677:最奇怪的是,您有一个NodeSet的deques数组(容器自己的实现)。但话说回来,这可能是满足您需求的正确解决方案。我在其他位置设置了一些占位符,因此我必须按顺序记录列表的开头和结尾。可能奇怪的是,我有100个queues@user2289677:最奇怪的是,您有一个NodeSet的deques数组(容器自己的实现)。但话说回来,这可能是满足您需求的正确解决方案。我在其他地方设置了一些占位符,因此我必须按顺序记录列表的开头和结尾。是的,我只想知道为什么在推回后,“next1=0x0026f350{no=3 next1=0x00299E8”变为“next1=0x0026f350{no=-858993460 next1=0x00000000”。您提到“no=-858993460”MS编译器经常使用它来初始化自动变量,但我在这里不声明新变量。@user2289677:如果0x0026f350
上的节点使用的内存不再有效,那么它可能会被重新用于其他用途-可能是push_back()中的局部变量
从未被使用过?如果没有Joachim要求的SSCE,我只是根据问题中给出的关于对象状态的微小信息进行一些有根据的猜测-绝对没有给出关于如何创建节点
列表的信息。但根据调试器输出,我可以猜测至少有一些该列表上的e对象已死亡。非常感谢,我找到了原因。你是对的,通过new创建节点可以修复它。再次感谢。是的,我只想知道为什么在推回后,“next1=0x0026f350{no=3 next1=0x002999e8”变为“next1=0x0026f350{no=-858993460 next1=0x00000000”。您提到“no=-858993460”经常被MS编译器用于
ns {entry=0x0026f5a0 {no=2 next1=0x0026f350 {no=-858993460 next1=0x00000000 {no=??? next1=??? next2=??? ...} ...} ...} ...} NodeSet