Повреждение памяти и сбой памяти memwatch
Когда я использовал memwatch с моей программой, я вылетал, как показано ниже:
* Ошибка в `./xxx': двойное освобождение или повреждение (нет): 0x0a015650 *...
Потому что это коммерческая программа. Я не могу показать свои коды. Но, есть ли у них какие-либо известные проблемы, связанные с повреждением памяти в memwatch? Я использую stdup() для создания строковой памяти и освобождаю ее сразу после ее использования. Так что двойного освобождения нет, заверил я
Также, когда я использовал valgrind, он показывает ту же ошибку
== 20929 == Недействительно free() / delete / delete[] / realloc() ==20929== в 0x402AC38: бесплатно (в /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so) .... ==20929== Адрес 0xb3b5948 занимает 40 байтов внутри блока размером 54 == 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 не показывал никаких ошибок, также нет сбоев. Так что я подозреваю, что есть какая-то известная проблема в оболочке melowatch malloc или free.
* Обновлено 2014 г. 3. 3 *
Я нашел ответ:-). Потому что я вообще не собирал библиотеки, используемые в моем приложении. Только приложение было создано с использованием memwatch.c и memwatch.h. Поэтому проблема в том, что память (mwMalloc) была создана в коде моего приложения и освобождена библиотекой. Так что, на мой взгляд, у memwatch есть этот недостаток, потому что все библиотеки должны быть собраны с поддержкой memwatch снова. Но это почти невозможно. Я думаю, что для скорости mtrace (встроенный glibc) будет лучше, или valgrind может быть использован в некоторых случаях.
1 ответ
Вы отправляете free() правильный указатель, возвращаемый функцией malloc или вашим вызовом strdup? Попробуйте напечатать адреса, используя "printf("%p\n", yourVar);" после создания вашей строки, то прямо перед отправкой на бесплатное. Есть ли различия?