О фактическом вопросе "откуда free
знает ...":
free
знает, что он не находится в начале чанка, потому что он поддерживает метаданные, о которых вы не знаете,Если вы думаете об этом, то это обязательно , так что в противном случае он не мог бы знать, сколько памяти освободить, учитывая только адрес.
Не указано, как именно среда выполнения хранит книгуразмеры выделения, только то, что вы должны никогда передавать любой указатель на free
, который не происходит от функции семейства malloc
.
Обычно это работаетmalloc
выделяя немного больше памяти, чем необходимо [1] и записывая некоторые метаданные в память , предшествующие возвращаемому адресу.free
затем просто просматривает, например, ptr[-8]
или что-либо еще (подробности реализации!), Чтобы прочитать эти метаданные.
Затем он может дополнительно выполнить некоторые проверки согласованности и может определить размер блока памяти (одна тривиальная проверка согласованности, котораявероятно, всегда выполняется проверка правильности выравнивания указателя).
Сказав это, пожалуйста, пожалуйста, пожалуйста, даже не думайте об игре с этими метаданными.
[1] Часто это так или иначе выполняется, чтобы удовлетворить требования выравнивания и из-за внутренних компонентов распределителя (большинство распределителей управляют памятью в разных «корзинах» фиксированного размера), так что если вы выделяете, скажем, 4 байта, вы номинально получаете 4 байта, но среда выполнения действительно выделяла 8 или 16 байтов большую часть времени (без вашего ведома).