从 VS2005 迁移到 VS2008 (win32) 后,我的应用程序崩溃(反复)。
如果我进入调试器,我会得到:
Access violation reading location 0x00000014
首先,我看到崩溃行处的类对象有一个 NULL _vptr。但同一类的其他一些对象具有非 NULL _vprt :)
其次,如果我更改成员对象声明的顺序,崩溃就会转移到其他行。
所以我猜这一定是一个损坏的堆问题。
你同意吗?如果是,堆栈中的分配数量(例如“char buffer[8192]”)是否会成为问题?
我尝试过purify、应用程序验证程序,但没有成功。我的应用程序是一个位于专有应用程序中的插件(dll)。我只能附加调试器。
提前致谢,
保罗
最佳答案
你同意吗?如果是,堆栈中的分配数量(例如 char buffer[8192]
)是否会出现问题?
是的,堆损坏可能是由在堆上分配的大尺寸数组(通过使用 new 或 malloc)引起的。如果你在Stack上创建一个巨大的数组,如果相邻的内存被分配给另一个对象,程序将覆盖该对象的数据,从而导致崩溃。因此,两者都可能是危险的,但由于不同的问题。如果您正在谈论堆栈数组,则不会,它不会仅仅因为堆栈或堆(而不是 C++ 中的自由存储)是两个不同的内存实体而导致堆损坏。
堆损坏可能非常令人沮丧且难以诊断。尽管有多种方法可以尝试调试此类错误,但没有明确的步骤来解决此类问题。
<强> Debugging Heap Corruption in Visual C++ Using Microsoft Debugging Tools for Windows 是一个很好的资源,记录了特定于 Visual C++ 的技术
关于c++ - 如何调试/修复访问冲突(堆损坏),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6511044/