2011-05-04 25 views

Respuesta

28

Usted también puede tener automáticas instancias de la clase, que no utiliza new, como:

class A{}; 

//automatic 
A a;    

//using new 
A *pA = new A(); 

//using malloc and placement-new 
A *pA = (A*)malloc(sizeof(A)); 
pA = new (pA) A(); 

//using ONLY placement-new 
char memory[sizeof(A)]; 
A *pA = new (memory) A(); 

Los dos últimos están usando placement-new que es ligeramente diferente de solo nuevo. placement-new se usa para construir el objeto llamando al constructor. En el tercer ejemplo, malloc solo asigna la memoria, no llama al constructor, es por eso que placement-new se usa para llamar al constructor para construir el objeto.

También tenga en cuenta cómo eliminar la memoria.

//when pA is created using new 
    delete pA; 

    //when pA is allocated memory using malloc, and constructed using placement-new 
    pA->~A(); //call the destructor first 
    free(pA); //then free the memory 

    //when pA constructed using placement-new, and no malloc or new! 
    pA->~A(); //just call the destructor, that's it! 

saber lo que es la colocación de nuevo, leer estas preguntas frecuentes:

+2

+1: Me preguntaba cuál era el término correcto para * no asignado dinámicamente *. * automático * - ¡Gracias! –

+3

Además, para apreciar las ventajas de utilizar instancias automáticas, necesita saber acerca de [RAII] (http://stackoverflow.com/questions/712639/). –

+0

Una variable 'auto' también se denomina a veces variable' stack'. ¿Cuántos programadores usan realmente la palabra clave 'auto' de todos modos? –

5

justo Usted puede declarar una variable normal:

YourClass foo; 
+1

Suponiendo que tiene un constructor predeterminado. – Nick

+0

¿Dónde puedo encontrar más información sobre una "variable normal"? –

-3

La mayoría de los objetos en C++ no deberían crearse utilizando los nuevos. En su lugar, se debe crear en la misma forma que lo haría crear números enteros o booleanos:

class Person { 
    ... 
}; 


int main() { 
    int x = 3; 
    boolean b = true; 
    Person p("fred"); 
} 

Creación de objetos con nueva debe reservarse para las ocasiones en las que necesita el polimorfismo, o posiblemente cuando se necesita para crear una serie de objetos , pero no sabe cuántos en tiempo de compilación.

+1

No, la decisión sobre cómo crear un objeto depende de cuánto tiempo se supone que debe vivir el objeto. Si existe solo dentro del alcance y la duración de una función dada, entonces tiene sentido convertirla en una variable local 'auto'. Si debe existir más allá de la ejecución de la función, debe asignarse dinámicamente. También está la cuestión de cuántos objetos se crean, es decir, tener una lista o una matriz de ellos en lugar de una sola instancia. –

+0

No, en absoluto: puedo crear una instancia en una función y devolverla a una función de llamada copiando, como lo haría para una instancia de un entero. ¿De todas las funciones que escribe que devuelven std :: cadenas las devuelven a través de punteros? –

+0

Parece que realmente te gusta copiar objetos ... –

0

El uso de malloc le dará el mismo resultado que el nuevo, simplemente sin llamar al constructor.

+0

No completamente erróneo, entonces no -1 ... Esto es algo correcto solo si el constructor no hace nada y la clase no tiene ningún método virtual ... –

2

Cualquiera de las formas habituales: como una variable local o estática, o como una temporal. En general, las únicas veces que usa new en C++ es cuando el objeto tiene identidad y una duración que no corresponde a corresponde a un ámbito, o cuando es polimórfico. (Hay excepciones de , por supuesto, pero no muchas.) Si el objeto puede ser copiado, generalmente es preferible usar instancias locales, copiando según sea necesario. (Al igual que lo haría para int, de hecho.)

Cuestiones relacionadas