usar punteros puntero operadores operador new memoria ejemplo dev delete declarar cuando como apuntadores c++ new-operator delete-operator

c++ - punteros - operadores de memoria new y delete



¿Por qué no están incorporados `new` y` delete` en el lenguaje y no solo las funciones normales? (3)

Quizás esta no sea la mejor referencia, pero esto es lo que dice Wikipedia sobre la ubicación new en C ++:

En versiones anteriores de C ++ no existía la colocación nueva ; en su lugar, los desarrolladores usaron una asignación explícita a this dentro de los constructores para lograr un efecto similar. Esta práctica ha sido desaprobada y abolida más tarde, y la tercera edición de El "Lenguaje de programación C ++" no menciona esta técnica. El soporte para el nuevo operador de colocación se ha agregado a los compiladores alrededor de 1995.

Tal vez en 2017 sea posible implementar una new función de biblioteca estándar. La implementación sugerida utiliza características de idioma que se agregaron recientemente (muchas de ellas después de 2010).

El lenguaje C ++, sin embargo, es mucho más antiguo (desde 1983) y al principio no había plantillas variadas, ningún typename , ninguna ubicación new , ninguna referencia de reenvío.

Al principio solo había una versión new y tenía que ser una característica de idioma en ese momento porque no había forma de implementarlo como una función de biblioteca.

¿Por qué la expresión new sin ubicación y la expresión de delete implementaron como lenguaje integrado en lugar de funciones regulares?

Si tenemos ...

  • una forma de solicitar / devolver memoria al sistema operativo

  • una forma de invocar explícitamente un constructor (colocación new )

  • una forma de invocar explícitamente un destructor ( ~T() )

... ¿por qué no podría la no colocación new y delete simplemente ser funciones regulares en la Biblioteca estándar? Ejemplo:

template <typename T, typename... Ts> T* library_new(Ts&&... xs) { auto* ptr = /* request enough memory for `T` from OS */; new (ptr) T(std::forward<Ts>(xs)...); return ptr; } template <typename T> void library_delete(T* ptr) { ptr->~T(); /* reclaim memory for `T` from OS */ }


Si el objetivo del usuario era crear un objeto en alguna ubicación de memoria, entonces lo new parecía un enfoque natural, ya que las referencias de reenvío , las plantillas variadas y la colocación nueva no eran una cosa en esos días. Como señalaron correctamente las plantillas @T.C. se lanzaron en 1990 y la colocación nueva en 1989. Las plantillas variables, por otra parte, se convirtieron en parte de C ++ solo en C ++ 11.

tl; dr No había forma de enviar un montón de argumentos a un constructor de un tipo arbitrario (como se puede hacer en la actualidad con make funciones make ).


Si ya se proporcionaron como funciones independientes, sería imposible proporcionarles un reemplazo definido por el usuario.

Por ejemplo, en este momento, de acuerdo con la norma, es Legel para escribir mi propio globl new y delete que se usará en todo el programa.

18.6.2 Asignación y desasignación de almacenamiento [new.delete]

2 Reemplazable: el programa AC ++ puede definir funciones con cualquiera de estas firmas de funciones y, por lo tanto, desplazar las versiones predeterminadas definidas por la biblioteca estándar de C ++.

Si se suministran como el resto de las funciones de la biblioteca, cada llamada normal a new o delete daría como resultado el error "más de una instancia de la función sobrecargada concuerda con los argumentos".