todas tipos resueltos punteros programacion parametros las funciones ejercicios ejemplos dev datos con c++ c++11 new-operator delete-operator

c++ - resueltos - tipos de funciones en programacion



¿Por qué no hay una expresión de eliminación de ubicación en C++? (5)

El objetivo de la ubicación nueva es separar la creación de objetos de su gestión de memoria. Entonces no tiene sentido atarlo durante la destrucción del objeto.
Si la memoria para sus objetos es de un montón y desea la misma duración para los objetos y su memoria simplemente use el operator new y el operator delete , tal vez anulándolos si quiere un comportamiento especial.
La colocación nueva es buena, por ejemplo, en el vector, que mantiene un gran trozo de memoria en bruto y crea y destruye el objeto dentro de él, pero sin liberar la memoria.

¿Por qué C ++ no tiene la eliminación de ubicación que corresponde directamente a la ubicación nueva, es decir, llama al destructor y llama al operador de eliminación de ubicación apropiado?

Por ejemplo:

MyType *p = new(arena) MyType; ... //current technique p->~MyType(); operator delete(p, arena); //proposed technique delete(arena) p;


En realidad, hay una eliminación de ubicación que la implementación llama para un objeto que fue "asignado" utilizando la colocación nueva si el constructor lanzó una excepción.

De Wikipedia .

Las funciones de eliminación de ubicación se invocan desde nuevas expresiones de ubicación. En particular, se llaman si el constructor del objeto arroja una excepción. En tal circunstancia, para garantizar que el programa no sufra una pérdida de memoria, se invocan las funciones de eliminación de ubicación.


Porque no es necesario, ya que tenemos ptr->~type();


Probablemente porque había sintaxis para llamar explícitamente a un destructor sin desasignar (exactamente como en su pregunta), pero no hay sintaxis para la construcción explícita en la memoria bruta.


operator delete es única al ser una función miembro no miembro o estática que se distribuye dinámicamente. Un tipo con un destructor virtual realiza la llamada a su propia delete desde el destructor más derivado.

struct abc { virtual ~abc() = 0; }; struct d : abc { operator delete() { std::cout << "goodbye/n"; } }; int main() { abc *p = new d; delete p; }

( Ejecuta este ejemplo )

Para que esto funcione con la eliminación de ubicación, el destructor tendría que pasar de alguna manera los argumentos adicionales al operator delete .

  • Solución 1: Pase los argumentos a través de la función virtual. Esto requiere un destructor virtual independiente para cada miembro estático y la sobrecarga global de operator delete con diferentes argumentos.
  • Solución 2: Permita que el destructor virtual devuelva un puntero de función a la persona que llama, especificando a qué operator delete debe llamarse la operator delete . Pero si el destructor realiza una búsqueda, se produce el mismo problema de requerir múltiples definiciones de funciones virtuales como # 1. Algún tipo de conjunto de sobrecarga abstracta debería crearse, que la persona que llamaba resolvería.

Tienes un punto perfectamente bueno, y sería una buena adición al idioma. Volver a adaptarlo a la semántica existente de la delete probablemente sea incluso posible, en teoría. Pero la mayoría de las veces no usamos la funcionalidad completa de delete y basta usar una llamada pseudo-destructor seguida de algo como arena.release(p) .