【发布时间】:2009-07-12 22:35:46
【问题描述】:
我正在开发 SDL 中的 GUI。我创建了一个从/主类,其中包含一个 std::list 指向它自己的从属的指针列表,以在 GUI 中创建一个层次结构(包含按钮的窗口。按钮标签等)。它工作了很长一段时间,直到我编辑了一个完全不同的类,它不会直接影响从属/主类。在 VS C++ 2008 express 中调试时,对旧从属/主类中的 list.push_front() 的调用现在会引发以下错误,我找不到导致它的原因。
"在 0x00b6decd 处未处理的异常 workbench.exe:0xC0000005:访问 违规读取位置 0x00000004。”
*workbench.exe 是我的项目。 在第 718 行的列表代码中的 _Insert 方法中引发了异常:
_Nodeptr _Newnode = _Buynode(_Pnode, _Prevnode(_Pnode), _Val);
列表是在主/从类的定义中创建的,从/主类是在堆上创建的,以插入另一个主从列表中。调用 push_front() 时崩溃的列表是空的,但它在层次结构中排在第二位,所以它工作了一次。正如我所说,它以前工作得很好,并且从属/主类没有被改变导致错误。 新类也使用列表。 使用多个列表会导致冲突吗?我可能不小心搞砸了堆吗? 对我可以寻找的任何帮助和提示表示感谢。
P.S 代码现在相当大,所以我想最好不要包含它。特别是因为我不确定是什么导致了错误。对不起,如果它有点稀缺
更新:我已将 push_front() 替换为创建迭代器并使用 insert()。结果是在分配 list.begin() 后指向“baadf00d”的迭代器。据我所知,baadf00d 是 VS 用来指向尚未分配任何东西的对象的一些错误/NULL 指针。我想这是列表损坏的另一个迹象?
【问题讨论】:
-
一个非常常见的堆错误是在代码中的其他地方访问超出范围,然后新/删除操作可能会变得很糟糕。我知道这在调试容器类等时发生在我身上。检查你的新类是否有任何超出范围的访问,记住这些可能会发生而不会导致崩溃,它们只是悄悄地发生。