Я сделаю снимок в темноте и угадаю, что вы пытаетесь free()
указатель ptr
перед выделением с помощью malloc()
.
Если он был инициализировандо NULL
, большинство free()
реализаций ничего не делают.Со страницы руководства free()
:
free () освобождает пространство памяти, на которое указывает ptr, которое должно быть возвращено предыдущим вызовом malloc (), calloc() или realloc ().В противном случае или, если free (ptr) уже был вызван ранее, происходит неопределенное поведение. Если ptr равен NULL, никакие операции не выполняются.
Если для него не задано значение NULL, вы пытаетесь освободить либо случайный указатель, либо что-то, что уже былобыл освобожден.
Тем не менее, Valgrind является лучшим инструментом для правильного обнаружения таких ошибок в системах POSIX.
РЕДАКТИРОВАТЬ:
Что нужно понимать, это то, что C - это , а не Java, и он не обладает роскошью виртуальной машины.Все существует в одном и том же адресном пространстве с минимальной защитой - и это включает в себя структуры распределителя памяти.Как только возникает ошибка, связанная с памятью, невозможно предсказать, как она станет известной.
Из двух других ошибок я бы, на первый взгляд, предположил, что (3) снова связано с освобождениемадрес, который не был выделен.Однако существует способ no , чтобы быть уверенным, что это действительно проблема.Как только память процесса повреждена, вы не можете доверять чему-либо , что он говорит вам о себе - что и происходит в этом случае.
Просто используйте подходящие средства отладки, такие как GDB или Valgrind, и сохранитесебе (и нам) боль гадать вслепую ...