0

当我在我的程序中使用 memwatch 时,我崩溃如下:

* `./xxx' 中的错误:双重释放或损坏(输出):0x0a015650 * ...

因为这是商业节目。我无法显示我的代码。但是,他们是否有任何已知问题与 memwatch 中的内存损坏有关?我正在使用 stdup() 创建字符串内存并在使用后立即释放它。所以没有双重免费,我保证

此外,当我使用 valgrind 时,它显示相同的错误

==20929== 无效的 free() / delete / delete[] / realloc()
==20929== 在 0x402AC38:免费(在 /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so 中)
……
==20929== 地址 0xb3b5948 在大小为 54 的块内分配了 40 个字节
==20929== 在 0x40299D8:malloc(在 /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so 中)
==20929== 由 0x8060F40: mwMalloc (memwatch.c:893)
==20929== 由 0x80614AC: mwStrdup (memwatch.c:1045)
...

一件奇怪的事情是,如果我不使用 memwatch,valgrind 没有显示任何错误,也没有崩溃。所以我怀疑 memewatch 的包装器 malloc 或 free 中存在任何已知问题。

* 2014 年更新。3. 3 *

我找到了答案:-)。因为我根本没有构建应用程序中使用的库。只有应用程序是用 memwatch.c 和 memwatch.h 构建的。所以问题是内存(mwMalloc)是在我的应用程序代码中创建并由库释放的。所以,在我看来,memwatch 有这个缺点,因为所有的库都应该再次使用 memwatch 支持来构建。但这几乎是不可能的。我认为,为了速度,mtrace(glibc 内置)会更好,或者在某些情况下可以使用 valgrind。

4

1 回答 1

0

您是否将 malloc 或您的 strdup 调用返回的右指针发送到 free() ?尝试使用 "printf("%p\n", yourVar);" 打印地址 在创建您的字符串之后,然后在将其发送到免费之前。有什么不同吗?

于 2014-02-28T09:06:09.360 回答