c++ - usadas - palabras en frances con w
Crear un objeto: con o sin `nuevo` (2)
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, here ); 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 alcance 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 dinámico y permite dos cosas:
Control preciso sobre la vida útil del objeto, ya que no sale automáticamente del alcance; 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 compilació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 dinámico, lo que significa que no será destruido hasta que use explícitamente delete
para hacerlo.