Никакое количество сброса и очистки, похоже, не повлияло на невоспроизводимые и измененные файлы в моем локальном репозитории git (я пробовал все варианты выше). Моим единственным решением для этого было rm локальное репо и повторное клонирование его с удаленного.
К счастью, у меня не было никаких других ветвей, о которых я заботился.
Вызов free()
указателя, не возвращенного функциями выделения памяти (malloc
, calloc
и т. д.) вызывает неопределенное поведение. У вашего кода есть неопределенное поведение, поэтому компилятору не нужно давать вам какую-либо диагностику, и он может показать любое поведение, может работать или сбой или буквально что-либо делать.
Просто избегайте писать код, который вызывает Undefined Behavior, это единственное решение.
Вы не должны этого делать. free
используется только для памяти, динамически распределенной из кучи с помощью malloc
семейства функций.
Память для num
статически выделена в сегменте данных и не может быть выпущена. Память для num2
выделяется в фрейме стека вызовов main
и будет выпущена, как только main
вернется.
Что на самом деле происходит, зависит от реализации free
. Обычно в куче обычно хранятся конкретные структуры данных, чтобы помочь malloc
/ free
отслеживать выделенные и свободные области памяти. free
ожидает, что эти структуры данных будут где-то вокруг места, на которое указывает его аргумент. Когда вы передаете ему указатель, который не указывает на область кучи malloc
-распределенной кучи, он будет рассматривать данные мусора как некоторую полезную информацию и делать какие-то странные вещи. И вам повезло, если результат - это просто немедленная сбой программы.