Для первой (не массива) части вопроса, ответы выше, указывающие на то, что компилятор вставляет код для отмены выделения соответствующего количества байтов в зависимости от типа указателя, не дают мне четкого ответа ... оператор удаления 1) вызывает деструктор, если это применимо, а затем 2) вызывает функцию "оператор удаления ()" ... это оператор удаления, который фактически отменяет распределение. Я вижу код, сгенерированный компилятором, который играет роль в части (1), т.е. адрес назначения деструктора должен быть вставлен. Но в части (2) это уже существующая библиотечная функция, которая обрабатывает перераспределение, так как он узнает размер данных? Глобальный оператор delete, который, я полагаю, используется во всех случаях, если только программист не определил версию члена класса / перегруженной глобальной версии, принимающий только аргумент void *, определяющий начало данных, поэтому он может даже не будет передан размер данных.
Я читал вещи, указывающие на идею сгенерированного компилятором кода, а также на то, что глобальный оператор delete для не-массивов просто использует free (), т.е. он знает размер данных не по типу указателя, а просматривая несколько байтов перед самими данными, где размер будет сохранен новым / malloc. Последнее - единственное решение, которое имеет смысл для меня, но, возможно, кто-то может просветить меня по-другому ...