resueltos que programacion orientada objetos objeto herencia ejercicios ejemplos constructores codigo clases c++ struct destructor

que - programacion orientada a objetos c++ ejemplos



¿Este destructor de C++ es redundante? (3)

Recibí un código C ++ con varias estructuras definidas así:

typedef struct _someStruct_ { std::string someString; std::vector<std::string> someVectorOfStrings; int someOtherStuff; ~_someStruct_() { someString.clear(); someVectorOfStrings.clear(); } } someStruct;

¿El destructor aquí es completamente redundante? Si la estructura fuera destruida por el destructor predeterminado, ¿no se destruirán cadenas, vectores, etc.?

Si hubiera escrito el código, no habría pensado en agregar un destructor explícito aquí, solo dejaría que el compilador lo haga.

Según tengo entendido, el único momento en que necesitarás crear tu propio destructor en una estructura es si alguno de los miembros de las estructuras contiene punteros a datos que podrían necesitar limpieza, o si hay alguna funcionalidad adicional (por ejemplo, para depurar, iniciar sesión cuando una estructura se elimina) es necesaria.

¿Me falta algo aquí? ¿Hay alguna razón por la cual las cadenas y los vectores se hayan borrado explícitamente en el destructor? Mi sospecha es que la persona que me envió esto es realmente un programador en C (véase el typedef) que ha intentado convertir un código C en C ++.


De hecho, esto es peor que simplemente usar el destructor implícito.

Al tener el destructor explícito, el compilador no le proporcionará un constructor de movimiento implícito.


El destructor es casi completamente redundante.

Hace tres cosas.

Primero, bloquea la creación automática de constructores de copia / movimiento y asignación. Esto ... puede que no sea algo bueno. Pero tal vez es deseado. Sin embargo, no es lo mismo que no estar allí.

En segundo lugar, cambia el orden en que se limpian las cosas. Se borra el búfer que contiene la cadena, luego se destruye cada búfer sostenido por las cadenas del vector mientras se destruye la cadena que los contiene, luego el vector con un búfer sin usar la memoria se destruye (devolviendo la memoria), luego se destruye la cadena ahora vacía.

Con un destructor predeterminado, el orden es que los búferes de la cadena del vector se destruyen, luego se devuelve la memoria para las cadenas del vector mientras se destruye el vector, luego la secuencia se destruye junto con su búfer que se devuelve.

Posiblemente podría detectar esto con sobrecargas adecuadas para el operador new & delete , o si usó asignadores personalizados.

Finalmente, tales destructores a veces pueden ser más fáciles de depurar, ya que puede atravesarlos.

Sin embargo, las probabilidades son que ninguno de estos efectos sutiles fue intencionado por el desarrollador que escribió ese código.


Sí, el destructor es completamente redundante.

Como ya dijiste, el código tiene otros signos de advertencia. Usar typedef struct por ejemplo no tiene sentido alguno en C ++, es tan redundante como el destructor vacío: el código fue escrito por alguien con una comprensión marginal de C ++, es probable que haya más errores (por un lado, el nombre de clase no es válido debido al subrayado principal en el alcance global).