Используя c:
char ptr[n];
free(ptr);
На мой взгляд: когда «char ptr [n];» используется, память выделяется, и ptr указывает на нее, free (ptr) должен работать.
И программа не удалась, почему? (N == 5, например)
Любой глубокий анализ?
Потому что ты звонил free
для переменной, не выделенной с malloc
,
Это вызывает Неопределенное поведение. К счастью для вас, он падает, и вы можете обнаружить его, иначе он может потерпеть крах в самые неловкие времена.
Ты звонишь free
для освобождения памяти переменных, выделенных в куче, у вас есть массив в локальном хранилище (при условии, что он находится в функции), и он автоматически освобождает, когда область ({
,}
) в котором он был создан заканчивается.
Потому что это неопределенное поведение, что вы делаете. (Это означает, что он может буквально сделать все, что угодно, в том числе сбой, запуск, казалось бы, нормально, заставляя демонов вылетать из твоего носа, и т.д.) можно только free()
указатель, который вы приобрели с помощью malloc()
,
Автоматические массивы не обязательно должны быть свободными () ‘d. Они освобождаются, когда их область действия заканчивается.
Только free
объект, который был выделен malloc
, Освобождение объекта, который не был выделен malloc
является неопределенным поведением.
Из-за `char ptr [n]; ‘ прочь объявить массив в СТЕК память, и он имеет область действия блока, что означает, что он уничтожается из памяти, когда блок заканчивается.
но когда вы используете malloc(size)
указатель будет указывать на кусок памяти в КУЧА память, и он берет объем, который дает программист. Я имею в виду, что когда вы хотите уничтожить его, вы должны использовать free(ptr)
или ОС освободит его после завершения программы.
Итак, когда вы используете free
по указателю, который указывает на кусок памяти в СТЕК памяти это вызывает неопределенное поведение и сбой программы, потому что free
работает только на КУЧА объем памяти.
Это выглядит похоже может ли звонок на свободный в с когда-либо потерпеть неудачу (SO)
Поведение не определено в соответствии со стандартом. В некоторых случаях ваш код не может произойти сбой так скоро. Это может привести к повреждению кучи и сбоям очень поздно во время выполнения и затруднить отладку.
В некотором смысле это зависит от дизайна методов malloc / free.
Один из способов, который я знаю:
с каждым malloc к блоку присоединяется дополнительный блок памяти, который возвращается функцией malloc (). Этот блок содержит некоторые служебные данные, которые необходимы при вызове free (). В вашем случае эти данные отсутствуют, так как память не была выделена функцией malloc (). Так свободно()
пытается использовать данные, предшествующие вашему массиву, не зная, что это мусор.