Este ejemplo es muy similar a Java.
En C++, solo utilizamos la gestión de memoria dinámica si es necesario.
Una mejor alternativa es simplemente declarar una variable local.
{
Foo f;
// use f
} // f goes out of scope and is immediately destroyed here.
Si debe usar memoria dinámica, utilice un puntero inteligente.
// In C++14
{
std::unique_ptr<Foo> f = std::make_unique<Foo>(); // no need for new anymore
}
// In C++11
{
std::unique_ptr<Foo> f(new Foo); // See Description below.
}
// In C++03
{
std::auto_ptr<Foo> f(new Foo); // the smart pointer f owns the pointer.
// At some point f may give up ownership to another
// object. If not then f will automatically delete
// the pointer when it goes out of scope..
}
Hay un manojo entero os punteros inteligentes proporcionados std :: int e impulso :: (ahora algunos están en std :: TR1) escoger el adecuado y utilizarlo para administrar la vida útil de su objeto.
Ver Smart Pointers: Or who owns you baby?
Técnicamente se puede utilizar la nueva/eliminar tareas de gestión de memoria.
Pero en código C++ real casi nunca se hace. Casi siempre hay una mejor alternativa para hacer la gestión de la memoria a mano.
Un ejemplo simple es std :: vector.Debajo de las cubiertas usa nuevo y eliminar. Pero nunca serías capaz de decir desde el exterior. Esto es completamente transparente para el usuario de la clase. Todo lo que el usuario sabe es que el vector tomará posesión del objeto y se destruirá cuando se destruya el vector.
Preguntas como esta me hacen sentir que estoy trabajando en un planeta diferente a los demás. Todas las respuestas a continuación sugieren que new/delete es obsoleto, peligroso, malvado, obsoleto; en mi (gran) empresa, ¡es básicamente el * único * mecanismo que utilizamos para asignar objetos dinámicos! Tenemos clases de contenedor, pero todas simplemente llaman a new/delete under. – Crashworks
Nota: 'Foo * f = new Foo' es perfectamente válido. – sbi
@Crashworks: lo que hacen debajo no importa sin embargo. Debajo, su llamada de bucle o función es solo un goto, pero eso no significa que "los gotos están bien para usar". Debajo, cada puntero y referencia se implementa pirateando direcciones de memoria, pero eso no significa que pueda tratar con seguridad punteros como direcciones de memoria. Esos son abstraídos, de forma muy similar a lo que usualmente se abstrae de las clases de contenedor y los contenedores de RAII – jalf