двойной свободный или коррупционный (вне) c [дубликат]

Никакое количество сброса и очистки, похоже, не повлияло на невоспроизводимые и измененные файлы в моем локальном репозитории git (я пробовал все варианты выше). Моим единственным решением для этого было rm локальное репо и повторное клонирование его с удаленного.

К счастью, у меня не было никаких других ветвей, о которых я заботился.

xkcd: Git

6
задан meagar 27 July 2012 в 16:58
поделиться

2 ответа

Вызов free() указателя, не возвращенного функциями выделения памяти (malloc, calloc и т. д.) вызывает неопределенное поведение. У вашего кода есть неопределенное поведение, поэтому компилятору не нужно давать вам какую-либо диагностику, и он может показать любое поведение, может работать или сбой или буквально что-либо делать.

Просто избегайте писать код, который вызывает Undefined Behavior, это единственное решение.

13
ответ дан Cool Guy 19 August 2018 в 02:16
поделиться
  • 1
    Вы также можете вызвать free () указателем NULL, поскольку это определено поведение. Просто убедитесь, что вы никогда не вызываете free () дважды по указателю same . – Anthony Giorgio 23 May 2012 в 12:50
  • 2
    как если я попытаюсь освободиться дважды? – caramel1995 23 May 2012 в 17:40
  • 3
    @ caramel23: Все, что вы можете получить, это Неопределенное Поведение. – Alok Save 23 May 2012 в 17:40

Вы не должны этого делать. free используется только для памяти, динамически распределенной из кучи с помощью malloc семейства функций.

Память для num статически выделена в сегменте данных и не может быть выпущена. Память для num2 выделяется в фрейме стека вызовов main и будет выпущена, как только main вернется.

Что на самом деле происходит, зависит от реализации free. Обычно в куче обычно хранятся конкретные структуры данных, чтобы помочь malloc / free отслеживать выделенные и свободные области памяти. free ожидает, что эти структуры данных будут где-то вокруг места, на которое указывает его аргумент. Когда вы передаете ему указатель, который не указывает на область кучи malloc -распределенной кучи, он будет рассматривать данные мусора как некоторую полезную информацию и делать какие-то странные вещи. И вам повезло, если результат - это просто немедленная сбой программы.

5
ответ дан Alex Bakulin 19 August 2018 в 02:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: