Indeed, this baffled me since moving from Pascal to C.
In Pascal you could use getmem()/freemem(), both accepting the size of the object. As a result the allocator should be simpler and more performant.
In C the allocator has to track that size, in addition to your program tracking it separately. And the complexity of allocators in C can go into black-arts territory.