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

*输入./xxx错误:两次释放或损坏(输出):0x0a015650 *
...

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

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

== 20929 ==无效的free()/ delete / delete [] / realloc()
== 20929 == at 0x402AC38:free(在/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。

最佳答案

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

关于c - 内存损坏和memwatch崩溃的问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22089816/

10-12 03:52