Crear un objeto: con o sin `nuevo`

Posible duplicado:
¿Cuál es la diferencia entre crear una instancia de un objeto utilizando nuevo vs. sin

Esta es probablemente una pregunta básica, y ya podría haberse preguntado (por ejemplo, aquí ); sin embargo, todavía no lo entiendo Entonces, déjame preguntarte.

Considere la siguiente clase de C ++:

class Obj{ char* str; public: Obj(char* s){ str = s; cout << str; } ~Obj(){ cout << "Done!\n"; delete str; // See the comment of "Loki Astari" below on why this line of code is bad practice } }; 

¿Cuál es la diferencia entre los siguientes fragmentos de código?

 Obj o1 ("Hi\n"); 

y

 Obj* o2 = new Obj("Hi\n"); 

¿Por qué el primero llama al destructor, pero este último no (sin una llamada explícita a delete )?

¿Cuál es el preferido?

Ambos hacen cosas diferentes.

El primero crea un objeto con duración de almacenamiento automático . Se crea, se usa y luego sale del scope cuando el bloque actual ( { ... } ) finaliza. Es la forma más simple de crear un objeto, y es exactamente lo mismo que cuando escribes int x = 0;

El segundo crea un objeto con una duración de almacenamiento dynamic y permite dos cosas:

  • Control preciso sobre la vida útil del objeto, ya que no sale automáticamente del scope; debes destruirlo explícitamente usando la palabra clave delete ;

  • Crear matrices con un tamaño conocido solo en tiempo de ejecución, ya que la creación de objetos ocurre en tiempo de ejecución. (No entraré en los detalles de la asignación de matrices dinámicas aquí).

Ninguno es preferido; depende de lo que está haciendo y cuál es más apropiado.

Usa el anterior a menos que necesites usar el último.

Su libro de C ++ debe cubrir esto bastante bien. Si no tiene uno, no vaya más allá hasta que haya comprado y leído, varias veces, una de estas .

Buena suerte.


Su código original está roto, ya que delete matriz sa char que no era new . De hecho, nada new d la cadena estilo C; vino de una cadena literal. delete eso es un error (aunque uno que no generará un error de comstackción, sino un comportamiento impredecible en tiempo de ejecución).

Por lo general, un objeto no debe tener la responsabilidad de delete nada que no sea new sí mismo. Este comportamiento debe estar bien documentado. En este caso, la regla se está rompiendo por completo.

El primero asigna un objeto con duración de almacenamiento automático, lo que significa que se destruirá automáticamente al salir del ámbito en el que está definido.

El segundo asignó un objeto con duración de almacenamiento dynamic, lo que significa que no será destruido hasta que use explícitamente delete para hacerlo.