Кажется, есть два аргумента, почему нужно освобождать их указатель на NULL
.
Избегайте сбоев при указаниях двойного освобождения.
Короткое: вызов free()
второй раз, случайно, не сбой, если он установлен на NULL
.
-
Почти всегда это маскирует логическую ошибку, потому что нет причин называть
free()
второй раз. Это безопаснее, если приложение будет аварийно и сможет его исправить. -
Не гарантируется сбой, потому что иногда новая память выделяется по тому же адресу.
-
Двойное освобождение происходит в основном, когда есть два указателя, указывающих на один и тот же адрес.
Логические ошибки также могут привести к повреждению данных.
Избегайте повторного использования бесплатных указателей
Короткие: доступ к свободным указателям может привести к повреждению данных, если malloc()
выделяет память в том же месте, если только освобожденный указатель не установлен на NULL
-
Невозможно гарантировать, что программа выйдет из обращения при указании
NULL
, если смещение достаточно велико (someStruct->lastMember
,theArray[someBigNumber]
). Вместо сбоя будет повреждение данных. -
Установка указателя на
NULL
не может решить проблему с другим указателем с тем же значением указателя.
Вопросы
Здесь сообщение против слепого указателя на NULL
после освобождения.
- Какой из них сложнее отлаживать?
- Есть ли возможность поймать оба?
- Насколько вероятно, что такие ошибки приводят к повреждению данных вместо сбоев?
Не стесняйтесь расширять этот вопрос.