c++ - 如何调试/修复访问冲突(堆损坏)

标签 c++ visual-studio-2008 heap-corruption

从 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/

相关文章:

c++ - WSASend 在大文件传输期间失败是否正常?

c# - 分析 SQL Server 性能问题?

c++ - Appverify 未捕获 C++ 堆损坏

c++ - 执行 SSE 内存复制导致堆损坏 - CRT 检查找不到任何东西

c++ - 什么是安全墙,我该如何使用它?

c++ - 忽略引用函数参数

c++ - 将 char[] 数组转换为字节,然后将字节转换为 int,反之亦然

visual-studio-2008 - 在构建期间复制文件

visual-studio-2008 - VS 2008 SP1 文本编辑器通过远程桌面连接闪烁

c - MALLOC_CHECK_ 用于 Linux 守护进程