Единственная причина, по которой free()
потерпит неудачу, заключается в том, что указатель, указанный вами, не обращается к выделенной куче.Это поведение четко определено: free()
либо сработает, либо ваша программа остановится из-за нарушения прав доступа.
Хорошей практикой является повторная инициализация указателей после их освобождения именно для этой цели.Это позволяет вам:
Убедитесь, что вы не размещаете поверх уже выделенного указателя (таким образом теряете ссылку на исходные блоки и вызываете утечку) (несмотря на realloc ()).
Убедитесь, что вы не освобождаете недавно освобожденную память или память, которая никогда не была выделена
Обе функции упрощаются, проверяя,указатель инициализирован (или, NULL).
Лучше всего сделать это вручную и привыкнуть к этому.Я видел очень запутанных способов повторной реализации free()
, чтобы автоматически инициализировать указатель, как этот маленький драгоценный камень, который также пытается избежать освобождения памяти, которая не была выделена:
void safe_free(void **p)
{
if (*p != NULL) {
free(*p);
*p = NULL;
}
}
Пожалуйста, не используйте этот код, он ужасно сломается на строгих платформах из-за разыменования указателя типа перфорированный.Кроме того, что, если указатель является строковым литералом?
Вместо этого просто убедитесь, что вы отслеживаете свои указатели и инициализируете их после освобождения.