C++ <;列表>;调用push_front()时引发未处理的异常

C++ <;列表>;调用push_front()时引发未处理的异常,c++,memory,list,C++,Memory,List,我正在SDL中开发GUI。我创建了一个从/主类,其中包含指向它自己的从的std::指针列表,以在GUI中创建继承权(包含按钮的窗口。按钮标签等等)。在我编辑了一个完全不同的类之前,它一直工作得很好,而这个类不会直接影响从属/主类。在旧的从/Stand类中调用SpopyFrxFor()时,在VS C++ 2008 Express中调试时,会引发以下错误,而我找不到是什么原因造成的。 “中0x00b6decd处未处理的异常” workbench.exe:0xC0000005:Access 违规读取位

我正在SDL中开发GUI。我创建了一个从/主类,其中包含指向它自己的从的std::指针列表,以在GUI中创建继承权(包含按钮的窗口。按钮标签等等)。在我编辑了一个完全不同的类之前,它一直工作得很好,而这个类不会直接影响从属/主类。在旧的从/Stand类中调用SpopyFrxFor()时,在VS C++ 2008 Express中调试时,会引发以下错误,而我找不到是什么原因造成的。 “中0x00b6decd处未处理的异常” workbench.exe:0xC0000005:Access 违规读取位置 0x00000004。“

*workbench.exe是我的项目。 第718行列表代码中的_Insert方法引发了异常:

_Nodeptr _Newnode = _Buynode(_Pnode, _Prevnode(_Pnode), _Val);
列表是在主/从类的定义中创建的,从/主类是在堆上创建的,以插入到另一个主/从列表中。调用push_front()时崩溃的列表是空的,但它是继承人制度中的第二行,因此它只工作了一次。正如我所说的,它以前工作得很好,并且slave/master类没有被修改以导致错误。 新类也使用列表使用多个列表会导致冲突吗?我可能是不小心把堆弄乱了吗? 对于我能找到的任何帮助和建议,我都表示感谢

另外,代码现在相当大,所以我想最好不要包含它。特别是因为我不太确定是什么原因导致了这个错误。对不起,如果有点少的话


更新:我用创建迭代器并使用insert()替换了push_front()。分配list.begin()后,结果是一个指向“baadf00d”的迭代器。据我所知,baadf00d是VS用来指向未分配任何内容的对象的错误/空指针。我想这是列表损坏的另一个迹象?

可能是您在原始代码中造成了某种缓冲区溢出或其他内存损坏,直到现在才出现。不同列表实例之间没有冲突的风险,正如您所说,新代码不会与旧代码交互。因此,除非使用magic,否则您已经编写了一个bug。

可能是您在原始代码中造成了某种缓冲区溢出或其他内存损坏,直到现在还没有表现出来。不同列表实例之间没有冲突的风险,正如您所说,新代码不会与旧代码交互。因此,除非使用magic,否则您已经编写了一个bug。

鉴于代码的缺乏,我所能做的就是给您一些我能想到的场景:

最明显也是最难发现的是内存损坏。该列表已经被遍历,因此添加到该项意味着该列表操纵垃圾内存。 您可以通过在声明中移动变量以及更改赋值顺序来测试这一点。如果这使错误消失或移动,则说明内存问题。您还可以尝试将列表更改为向量,并查看其作用


第二种可能性是,您有一个指针/引用列表,并且这些项在放入堆栈之前/之后被释放。如果将堆栈对象的地址放入其他位置分配的列表中,则很容易发生这种情况。你说你在堆上创建了对象,所以我猜不是这样。

鉴于缺乏代码,我能做的就是给你一些我能想到的场景:

最明显也是最难发现的是内存损坏。该列表已经被遍历,因此添加到该项意味着该列表操纵垃圾内存。 您可以通过在声明中移动变量以及更改赋值顺序来测试这一点。如果这使错误消失或移动,则说明内存问题。您还可以尝试将列表更改为向量,并查看其作用


第二种可能性是,您有一个指针/引用列表,并且这些项在放入堆栈之前/之后被释放。如果将堆栈对象的地址放入其他位置分配的列表中,则很容易发生这种情况。你说你在堆上创建了对象,所以我猜不是这样的。

通常,地址为0x00000004的错误表示取消引用空指针,例如

 struct point {
    int x;
    int y;
 };

 struct point *pt = NULL;
 printf("%d\n", pt->y);
可能会产生这样的错误


在我看来,这不像堆损坏,通常这些错误更微妙,我打赌这是一个空指针的情况。我会在调用堆栈中查找空指针,可以是您要推到列表前面的对象的成员,也可以是该对象本身。如果您确实认为这是一个堆损坏问题,您可以使用免费的启用页堆等功能,这样可以让您更早地检测到堆损坏,希望是在发生时,而不是通过它以后引起的副作用。

像这样的错误,地址为0x00000004,通常表示取消引用空指针,例如

 struct point {
    int x;
    int y;
 };

 struct point *pt = NULL;
 printf("%d\n", pt->y);
可能会产生这样的错误


在我看来,这不像堆损坏,通常这些错误更微妙,我打赌这是一个空指针的情况。我会在调用堆栈中查找空指针,可以是您要推到列表前面的对象的成员,也可以是该对象本身。如果您确实认为这是一个堆损坏问题,您可以使用免费的启用页堆之类的功能,这样可以让您更早地检测到堆损坏,希望是在发生时,而不是通过它以后引起的副作用。

我猜,根据对_Prevnode和push_front的组合的观察,列表可能是由于误用了迭代器而被破坏的。损坏列表的另一种方法是从空列表中删除元素。确保在VS2008中启用了迭代器调试。它将更早地捕捉到许多问题。

我的猜测是,根据看到的“Prevnode”和“push\u front”的组合,列表