调试对释放的内存的非法访问

时间:2012-09-18 06:20:41

标签: c++ memory-management

我现在正在追逐一个错误几周。我正在使用多线程环境(C ++,VC2010),我有时看到的是新的或删除崩溃。

当我查看输出时,我看到一个抱怨的内存已被释放,之后被修改(HEAP: Free Heap block 55e6128 modified at 55e619c after it was freed)。当我查看同一地址(0x55e6128)的内存时,我可以看到0xFEE E,然后是00 00 00 00,然后又FE EE的模式。

它在我看来是一个删除的对象,它有一个4字节长的成员(或指针),有人试图在删除对象后将此成员设置为零。

知道如何调试吗?

2 个答案:

答案 0 :(得分:0)

这个4字节的成员是公开的吗?如果是这样,这就是公共数据成员为什么不好的一个例子,你应该几乎总是将它们设为私有或受保护(并且可能提供getter / setter)。

因此,如果它是公开的,我建议将其设为私有,并添加一个getter和setter。然后在setter处设置一个断点并继续运行应用程序,每次都检查一次,直到你看到一个已经解除分配的对象上调用setter。

答案 1 :(得分:0)

几周后我发现了问题。有一个原始指针指向在两个线程之间共享的对象。您无法确定哪个线程先完成该线程,因此这是谁负责删除的问题。其中一个删除了指针,另一个仍在使用指针并将其设置为零(因此我在已删除的内存中看到的4个字节为零)。 解决方案是使用std :: shared_ptr而不是带有new和delete的原始指针。 shared_ptr是线程安全的。