Para la primera parte (no es un array) de la pregunta, las respuestas anteriores indicando que el compilador inserta código para desasignar el número apropiado de bytes en función del tipo de puntero, no bastante proporcionan una respuesta clara para mí ... el operador delete 1) llama a un destructor si corresponde y luego 2) llama a la función "operator delete()" ... es la eliminación del operador la que realmente desasigna. Puedo ver que el código generado por el compilador desempeña un papel en la parte (1), es decir. la dirección de destino del destructor debe ser insertada. Pero en la parte (2), es una función de biblioteca preexistente que maneja la desasignación, entonces, ¿cómo sabrá el tamaño de los datos? El operador global delete - que, creo que se usa en todos los casos, a menos que el programador defina una versión global de clase/miembro sobrecargado - acepta solo un argumento nulo * que especifica el inicio de los datos, por lo que puede incluso se aprobó el tamaño de los datos. He leído cosas que indican la idea del código generado por el compilador, así como cosas que sugieren que la eliminación del operador global para no arrays simplemente usa free(), es decir. conoce el tamaño de los datos no por el tipo de puntero, sino por mirar unos pocos bytes antes de los datos, donde el tamaño habrá sido guardado por new/malloc. Esta última es la única solución que tiene sentido para mí, pero tal vez alguien me puede aclarar de manera diferente ...