当我在我的程序中使用 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。