Функция malloc()
предоставляет указатель на область памяти, которую затем можно использовать точно так же, как любой указатель на область памяти.
Способ представления malloc()
и free()
заключается врассмотреть это с точки зрения того, кто владеет областью памяти. Функция malloc()
владеет памятью, которой она управляет. Когда вы вызываете функцию malloc()
или calloc()
, функция забирает часть памяти, которой она управляет, и передает вам право собственности. Когда функция вызывается и выделяется память, происходит передача прав собственности из системы управления памятью malloc()
вам, и в этот момент вы владеете этой памятью, и вы сами можете управлять ею. Когда вызывается функция free()
для освобождения памяти, вы передаете право владения областью памяти от себя обратно системе управления памятью malloc()
.
Всякий раз, когда выполняется передача права собственности, объектотказ от владения не должен делать что-либо еще с областью памяти, поскольку он больше не владеет ею.
Поэтому, когда вы делаете malloc()
, вы теперь владеете памятью и можете использовать и повторно использовать область памятистолько, сколько вам нужно, до тех пор, пока вы не вызовете функцию free()
, чтобы вернуть ее malloc()
.
Указатель на область памяти, заданный malloc()
, похож на любой другой указательчто касается его использования.
После того, как вы перевели владение областью памяти обратно в malloc()
с помощью функции free()
, вы не можете снова вызывать free()
с тем же указателем безвнося ошибку. Как только область памяти была возвращена с помощью free()
, у вас больше нет владения памятью, поэтому вы не должны пытаться делать с ней что-либо еще, включая повторный вызов free()
с указателем.
Какmalloc()
управление памятью - это деталь реализации, которая будет варьироваться в зависимости от компилятора и используемой среды выполнения C. В некоторых случаях, если вы malloc()
память, затем free()
память, а затем malloc()
снова тот же объем памяти, вы можете повезти и снова получить ту же область памяти, однако это не то, на что вы можете рассчитывать или чего следует ожидать.
malloc()
предоставляет вам указатель на область памяти, которая имеет несколько гарантий. Прежде всего, предоставленная область памяти будет как минимум такой же большой, как вы запрашивали. Может быть больше, но не меньше того, что вы просили. Во-вторых, предоставленный адрес будет находиться на границе памяти, подходящей для архитектуры машины, так что вы можете использовать адрес, предоставленный для любого типа переменной, будь то встроенный, например, int
или double
или struct
, или массив некоторыхвведите.
Как владелец области памяти, предоставленной malloc()
, вы несете ответственность за возвращение области памяти к функциональности malloc()
, как только закончите с ней.
Ваш другойглавная обязанность - соблюдать размер области памяти и не записывать в область больший блок данных, чем тот размер, который был запрошен при выполнении malloc()
. Вам гарантирован только требуемый объем памяти, и запись большего объема данных в память, вероятно, перезапишет память, которой вы не владеете, но которой владеет что-то другое.
К сожалению, поскольку функциональность malloc()
, вПо крайней мере, оптимизированная или не отлаженная версия библиотеки разработана с минимальными накладными расходами, функциональность имеет мало проверок согласованности и исправности. Функциональность malloc()
надеется, что вы будете соблюдать правила и рекомендации и использовать только то, что имеете. И часто, когда вы нарушаете правила и руководящие принципы, вы не увидите эффекта в тот момент, когда допустили ошибку, а скорее в какой-то другой момент, когда обнаружится какое-то таинственное повреждение памяти и ваша программа вылетит.