Рассуждения не верны. Причины Три:
1. Разрядность операционной системы. Если брать х86 и х64, то вначале может быть выделен блок в 4 или 8 байт (иначе было бы невозможно выделить непрерывный блок боле 4 гигабайт).
2. Способ, которым выделялась память. Если выделял через new (молодец, возьми с полки пирожок), то перед блоком памяти записан размер этого блока. А если через malloc или аналогичную, то выделяется только блок памяти, без служебных данных.
3. В зависимости от настроек компилятора может быть добавлено ещё байтов в начале и в конце блока, содержащих некоторое флаговое значение, чтобы отслеживать ошибки выхода за границы массива.
А что ты там хранишь в списках и куда отдаёшь - я не понял. Если ты реализуешь свой диспетчер памяти, то можешь реализовать его так, как захочется.