Куча отслеживает все блоки памяти, как выделенные, так и свободные, специально для этой цели. Типичная (если наивная) реализация выделяет память, использует несколько байтов в начале для учета и возвращает адрес после этих байтов. При последующих операциях (free / realloc) было бы вычтено несколько байтов, чтобы попасть в область бухгалтерии.
Некоторые реализации кучи (скажем, Windows GlobalAlloc()
) позволяют узнать размер блока с учетом начального адреса. Но в куче RTL C / C ++ такого сервиса нет.
Обратите внимание, что malloc () иногда перераспределяет память, поэтому информация о malloc
размере блока будет иметь ограниченную полезность. C ++ new [] 'ed массивы, это совсем другое дело - для тех, кто знает, точный размер массива необходим для правильной работы уничтожения массива. Тем не менее, в C ++ нет такой вещи, как оператор dynamic_sizeof
.