Когда ты выделяешь память через malloc(), распределитель памяти сохраняет метаданные о размере выделения. Эти метаданные обычно хранятся в блоке заголовка, расположенном прямо перед самой выделенной памятью.
Когда ты вызываешь free(i), функция не требует, чтобы ты указывал размер, потому что:
free() использует эти метаданные, чтобы определить, ровно сколько байтов нужно освободить[Метаданные: Size=12][Реально выделенная память (12 байт)]
↑
указатель, возвращенный malloc
Этот механизм работает автоматически с malloc() и free(). Однако если ты используешь new и delete в C++, действует тот же принцип, но с учётом типов при управлении памятью. Именно поэтому смешивать malloc/free с new/delete небезопасно — они могут использовать разные распределители.
Понимание этого объясняет, почему правильное управление памятью критично в C и почему современный C++ рекомендует использовать умные указатели вроде std::unique_ptr или std::shared_ptr вместо них.
Функция free() требует от программиста передать как указатель, так и исходный размер выделения в качестве аргументов, поэтому сигнатура имеет вид free(void *ptr, size_t size).
Новый — ещё не проверен сообществом
Вы