0

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

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

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

知道如何调试吗?

4

2 回答 2

0

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

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

于 2012-09-18T06:40:40.763 回答
0

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

于 2018-12-06T22:30:39.727 回答