2009-03-24 22 views
86

Duplicar posibles:
When should I use the new keyword in C++?Cuándo usar "nuevo" y cuándo no hacerlo, en C++?

Cuando debo usar el operador "new" en C++? Vengo de C#/Java y la creación de instancias de objetos me resulta confusa.

Si he creado una clase simple denominada "Punto", cuando se crea un punto debo:

Point p1 = Point(0,0); 

o

Point* p1 = new Point(0, 0); 

Puede alguien aclararme cuándo utilizar el nuevo operador y cuando no?

Duplicado de:

When should I use the new keyword in C++?

relacionadas:

About constructors/destructors and new/delete operators in C++ for custom objects

Proper stack and heap usage in C++?

+0

duplicado - demasiadas veces para contar –

+0

como dijo Neil, esto se ha pedido innumerables veces. – Naveen

Respuesta

110

Debe utilizar new cuando desee que un objeto permanezca en existencia hasta que delete. Si no usa new, el objeto se destruirá cuando salga del alcance. Algunos ejemplos de esto son:

void foo() 
{ 
    Point p = Point(0,0); 
} // p is now destroyed. 

for (...) 
{ 
    Point p = Point(0,0); 
} // p is destroyed after each loop 

Algunas personas dirán que el uso de new decide si el objeto está en el montón o la pila, pero eso sólo es cierto para las variables declaradas dentro de las funciones.

En el siguiente ejemplo, la ubicación de 'p' será donde se asigna su objeto contenedor, Foo. Prefiero llamar a esta asignación 'en el lugar'.

class Foo 
{ 

    Point p; 
}; // p will be automatically destroyed when foo is. 

Asignación (y liberando) objetos con el uso de new es mucho más caro que si se asignan en el lugar por lo que su uso debe estar restringido a donde sea necesario.

Un segundo ejemplo de cuándo asignar a través de new es para matrices. No puede * cambiar el tamaño de una matriz in situ o de acumulación en tiempo de ejecución, por lo que cuando necesite una matriz de tamaño indeterminado, deberá asignarla a través de una nueva.

E.g.

void foo(int size) 
{ 
    Point* pointArray = new Point[size]; 
    ... 
    delete [] pointArray; 
} 

(* nitpicking preventiva - sí, hay extensiones que permiten asignaciones de pila de tamaño variable).

+2

+1 Solo recuerde que necesita eliminar manualmente el puntero newed delete p1; –

+6

+1 buena. solo recuerda que el primero se puede escribir como Punto p (0, 0); también. la sintaxis = puede hacerle pensar que p de alguna manera es un puntero al que se le ha asignado algo. –

+0

@Andrew Grant Si debe usar el nuevo uso 'shared_ptr' o' unique_prt'. que se introdujeron en C++ 11 STL punteros compartidos harán la contabilidad de eliminación automáticamente. nota para Deleter matrices por defecto proporcionado por 'llamadas shared_ptr' borrar, no elimine [] Por lo tanto, utilizar las funciones lambda ' std :: shared_ptr p (new int [10], [] (int * p) { eliminar [ ] p; }); ' o ' std :: shared_ptr p (new int [10], std :: default_delete ()); ' o el uso de ayudante provisto de unique_ptr que pide eliminar [ ] 'std :: unique_ptr p (nuevo int [10], [] (int * p) { borrar [] pag; }); ' – katta

9

Eche un vistazo a this question y this question para obtener algunas buenas respuestas sobre la creación de instancias de objetos en C++.

Esta idea básica es que los objetos instanciados en el montón (usando nuevo) deben limpiarse manualmente, los instantaneos en la pila (sin nuevos) se limpian automáticamente cuando salen del alcance.

void SomeFunc() 
{ 
    Point p1 = Point(0,0); 
} // p1 is automatically freed 

void SomeFunc2() 
{ 
    Point *p1 = new Point(0,0); 
    delete p1; // p1 is leaked unless it gets deleted 
} 
1

Nuevo siempre se utiliza para asignar memoria dinámica, que luego debe liberarse.

Al hacer la primera opción, esa memoria se liberará automágicamente cuando se pierda el alcance.

Point p1 = Point(0,0); //This is if you want to be safe and don't want to keep the memory outside this function. 

Point* p2 = new Point(0, 0); //This must be freed manually. with... 
delete p2; 
4

Debe usar nuevo cuando desee que se cree un objeto en el montón en lugar de la pila. Esto permite acceder a un objeto desde fuera de la función o procedimiento actual, a través de punteros.

Podría ser útil para buscar punteros y administración de memoria en C++, ya que estas son cosas que es poco probable que hayas encontrado en otros idiomas.

+0

Nuevo no garantiza la asignación del montón y simplemente evitar nuevo no garantiza la asignación de la pila. –

Cuestiones relacionadas