¿Cuándo usar “nuevo” y cuándo no, en C++? [duplicate]

4 minutos de lectura

Posible duplicado:

¿Cuándo debo usar la nueva palabra clave en C++?

¿Cuándo debo usar el operador “nuevo” en C++? Vengo del fondo de C#/Java y crear instancias de objetos es confuso para mí.

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 usar el nuevo operador y cuándo no?

Duplicado de:

¿Cuándo debo usar la nueva palabra clave en C++?

Relacionados:

Acerca de constructores/destructores y operadores de nuevo/borrado en C++ para objetos personalizados

¿Uso adecuado de pila y montón en C++?

  • duplicado – demasiadas veces para contar

    luego

    24 de marzo de 2009 a las 22:59

  • como dijo Neil, esto se ha preguntado innumerables veces.

    – Naveen

    25 de marzo de 2009 a las 4:50

¿Cuando usar nuevo y cuando no en C duplicate
andres beca

Deberías usar new cuando deseas que un objeto permanezca en existencia hasta que delete eso. Si no usas new entonces el objeto será destruido 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 esto 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 arreglos. No puede* cambiar el tamaño de una matriz en el lugar o apilada en tiempo de ejecución, por lo que cuando necesite una matriz de tamaño indeterminado, debe asignarse a través de new.

P.ej

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

(* quisquilloso preventivo: sí, hay extensiones que permiten asignaciones de pilas de tamaño variable).

  • +1 Solo recuerde que debe eliminar manualmente el puntero nuevo delete p1;

    – Gregor Brandt

    24 de marzo de 2009 a las 23:00

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

    – Johannes Schaub – litb

    24 de marzo de 2009 a las 23:10

  • @Andrew Grant Si debe usar un nuevo uso shared_ptr o unique_prt. que se introdujeron en c ++ 11 STL punteros compartidos llevarán el registro de eliminación automáticamente. nota para el eliminador predeterminado de matrices proporcionado por shared_ptr borrar llamadas, no borrar[] por lo tanto, use funciones lambda std::shared_ptr<int> p(new int[10], [](int* p) { delete[] p; }); o std::shared_ptr<int> p(new int[10], std::default_delete<int[]>()); o usando el ayudante proporcionado por unique_ptr que llama a delete[] std::unique_ptr<int,void(*)(int*)> p(new int[10], [](int* p) { delete[] p; });

    – katta

    27 de febrero de 2017 a las 20:11

  • Esta respuesta tiene más de 10 años. ¿No debería ser ahora “nunca se usa ‘nuevo’, entre RAII y los punteros inteligentes nunca se necesita”?

    – Víctor Eijkhout

    20 de agosto de 2019 a las 12:06

¿Cuando usar nuevo y cuando no en C duplicate
Eclipse

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

Esta idea básica es que los objetos instanciados en el montón (usando new) deben limpiarse manualmente, aquellos instanciados en la pila (sin new) se limpian automáticamente cuando quedan fuera 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
}

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

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

  • New no garantiza la asignación del montón y simplemente evitar new no garantiza la asignación de la pila.

    – Michael J. Grey

    23 de noviembre de 2015 a las 19:11

New siempre se usa para asignar memoria dinámica, que luego debe liberarse.

Al hacer la primera opción, esa memoria se liberará automáticamente 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;

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad