当我在我的程序中使用了memwatch时,我崩溃如下:
*“./xxx”出错:双重免费或损坏(退出):0x0a015650 * ...
因为这是商业计划。我无法显示我的代码。 但是,他们的任何已知问题都与memwatch中的内存损坏有关吗? 我正在使用stdup()来创建字符串内存并在使用它之后释放它。 所以没有双重免费,我保证
当我使用valgrind时,它显示相同的错误
==20929== Invalid free() / delete / delete[] / realloc() ==20929== at 0x402AC38: free (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so) .... ==20929== Address 0xb3b5948 is 40 bytes inside a block of size 54 alloc'd ==20929== at 0x40299D8: malloc (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so) ==20929== by 0x8060F40: mwMalloc (memwatch.c:893) ==20929== by 0x80614AC: mwStrdup (memwatch.c:1045) ...
一个令人厌烦的事情是,如果我没有使用memwatch,valgrind没有显示任何错误,也没有崩溃。 因此我怀疑memewatch的包装器malloc或free中存在任何已知问题。
* 2014年更新.3。3 *
我找到了答案:-)。 因为我根本没有构建我的应用程序中使用的库。 只有应用程序是用memwatch.c和memwatch.h构建的。 所以问题是内存(mwMalloc)是在我的应用程序代码中创建的,并由库释放。 因此,在我看来,memwatch有这个缺点,因为所有库都应该再次使用memwatch支持构建。但这几乎是不可能的。我认为,对于速度,mtrace(glibc内置)会更好,或者valgrind可以用于某些情况。
答案 0 :(得分:0)
你是否向free()发送malloc或strdup调用返回的右指针?尝试使用“printf(”%p \ n“,yourVar)打印地址;”在创建字符串之后,然后将其发送到免费之前。 有什么不同吗?