Tamanho C ++ da memória dinâmica em tempo de execução

Isso é algo que eu venho pensando há algum tempo e nunca encontrei uma resposta para:

Por que quando você aloca algo no heap, não é possível determinar o tamanho dele apenas no ponteiro, mas pode excluí-lo usando apenas o ponteiro e, de alguma forma, o C ++ sabe quantos bytes devem ser liberados?

Isso tem algo a ver com a maneira como é armazenado na pilha? Essas informações estão lá, mas não são expostas pelo C ++?

E talvez essa deva ser uma pergunta separada, mas acho que é bem relacionada, então vou perguntar aqui:

Por que é que uma matriz dinâmica de elementos deve ser excluída usandodelete [] ao contrário do simplesdelete comando; por que o C ++ precisa dessas informações adicionais para liberar corretamente toda a memória?

questionAnswers(1)

yourAnswerToTheQuestion