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).
duplicado - demasiadas veces para contar –
como dijo Neil, esto se ha pedido innumerables veces. – Naveen