Поведение malloc()
и free()
сильно зависит от операционной системы и используемой вами библиотеки Си. В большинстве реализаций фактически есть два распределителя памяти в игре:
Распределитель памяти ОС, который использует средства виртуальной памяти процессора для обеспечения процесса собственным адресным пространством и отображает страницы физической памяти в это адресное пространство для использования.
Распределитель памяти библиотеки C, который на самом деле является частью кода приложения и использует страницы, предоставляемые ОС, для обеспечения детализированных средств управления памятью, как предусмотрено malloc()
и free()
.
Как правило, вызов free()
выполняет одно или несколько из следующих действий:
Помечает указанную область памяти как свободную в распределителе памяти C. Это позволяет повторно использовать эту память. free()
не обнуляет освобожденную память.
Это может вернуть память в ОС, в зависимости от настроек распределителя памяти C и того, возможно ли вообще освободить эту часть кучи. Если память не возвращается в ОС, она может быть повторно использована будущими вызовами malloc()
тем же приложением.
Если вы пытаетесь получить доступ к освобожденной памяти, обычно происходит одно из трех:
Память возвращена ОС, и ваша программа, как правило, вылетает. Если вы спросите меня, это, вероятно, лучший сценарий - у вас есть проблема, конечно, но вы ее знаете .
Память не была повторно использована, поэтому ваши старые данные все еще там. Ваша программа продолжается, как будто ничего не случилось. Это на мой взгляд худший вариант развития событий. Похоже, ваш код работает правильно, и, если Мерфи имеет право голоса, он будет продолжать действовать до тех пор, пока не достигнет ваших конечных пользователей - , а затем он будет впечатляющим.
Память была повторно использована вашей программой, и ваш код начнет возиться с собственными данными. Если вы осторожны (и удачливы?), Вы, вероятно, заметите, что результаты выключены. Если нет, хорошо ...
Если вы работаете в Linux / Unix Valgrind - хороший инструмент для решения проблем управления памятью, подобных этой. Существуют также библиотеки замены для распределителя памяти C, такие как DUMA , которые также позволяют обнаруживать такие проблемы.