new how c++ new-operator

how - ¿Cuándo usar "nuevo" y cuándo no, en C++?



new keyword c++ (4)

Posible duplicado:
¿Cuándo debería usar la palabra clave nueva en C ++?

¿Cuándo debería usar el operador "nuevo" en C ++? Vengo de C # / Java y la creación de instancias de objetos me resulta confusa.

Si he creado una clase simple llamada "Punto", cuando creo un punto, debería:

Point p1 = Point(0,0);

o

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

¿Alguien puede aclararme cuándo utilizar el nuevo operador y cuándo no?

Duplicado de:

¿Cuándo debería usar la palabra clave nueva en C ++?

Relacionado:

Acerca de los constructores / destructores y los operadores nuevos / eliminar en C ++ para objetos personalizados

¿Uso correcto de pila y pila en C ++?


Debe usar new cuando desee que un objeto siga existiendo hasta que lo 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 su objeto está en el montón o en la pila, pero eso solo 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.

Asignar (y liberar) objetos con el uso de new es mucho más costoso que si se asignan en el lugar por lo que su uso debe restringirse 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.

P.ej

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

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


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.

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


Eche un vistazo a esta pregunta y a esta pregunta 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 que se crean instancias 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 }


Nuevo siempre se usa 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;