new ejemplo array c++ exception malloc new-operator

c++ - ejemplo - Por qué la nueva versión std:: nothrow no se usa ampliamente



new c++ (2)

Esta pregunta ya tiene una respuesta aquí:

De acuerdo con la referencia de C ++ , puede crear un objeto nuevo mediante:

MyClass * p1 = new MyClass;

o por

MyClass * p2 = new (std::nothrow) MyClass;

El segundo devolverá un puntero nulo en lugar de lanzar una excepción.

Sin embargo, casi no veo esta versión en mi experiencia.

Por ejemplo, Google no recomienda el uso de excepciones en su código, pero tampoco están usando la versión de nothrow en Chromium, como puedo ver.

¿Hay alguna razón por la que preferimos el valor por defecto frente al de cambio? Incluso en un proyecto que no está utilizando la excepción?

- EDITAR -

Pregunta de seguimiento: ¿Debo verificar el valor de retorno de malloc() ?

Parece que, por el contrario, muchas personas aconsejan verificar el valor de retorno de malloc, algunos dijeron porque:

muchas fallas en la asignación no tienen nada que ver con estar fuera de la memoria. La fragmentación puede hacer que una asignación falle porque no hay suficiente espacio contiguo disponible, aunque hay mucha memoria libre.

¿Es esto cierto? ¿Por qué tratamos malloc() y new() diferente en este caso?


Sin embargo, casi no veo esta versión en mi experiencia.

Lo usaría (o, de manera equivalente, detectaría la excepción de la versión predeterminada) si puede manejar la falla localmente; tal vez solicitando liberar otra memoria y luego volviendo a intentarlo, o tratando de asignar algo más pequeño, o usando un algoritmo alternativo que no necesite memoria adicional.

¿Hay alguna razón por la que preferimos el valor por defecto frente al de cambio?

El principio general de las excepciones: si no puede manejarlo localmente, entonces no tiene sentido verificarlo localmente. A diferencia de los valores de retorno, las excepciones no se pueden ignorar, por lo que no hay posibilidad de arar independientemente y usar un puntero nulo.

Incluso en un proyecto que no está utilizando la excepción?

A menudo, una condición de falta de memoria no se puede manejar en absoluto. En ese caso, terminar el programa es probablemente la mejor respuesta; y esa es la respuesta predeterminada a una excepción no controlada. Entonces, incluso si no está utilizando excepciones, la new opción predeterminada es probablemente la mejor opción en la mayoría de las situaciones.

¿Debo verificar el valor de retorno de malloc() ?

Sí: esa es la única manera de comprobar si tuvo éxito. Si no lo hace, entonces podría terminar usando un puntero nulo, dando un comportamiento indefinido: a menudo un bloqueo, pero tal vez la corrupción de los datos u otro comportamiento extraño y largas sesiones de depuración para (con suerte) averiguar qué fue lo que salió mal.

¿Por qué tratamos malloc() y new diferente en este caso?

Debido a que malloc nos obliga a verificar el valor de retorno, mientras que new nos da la opción de un manejo de errores menos intrusivo.


Si usa la versión de lanzamiento, no necesita probar el resultado de cada new llamada para ver si tuvo éxito o no. Hablando típicamente en muchas / la mayoría de las aplicaciones, si su asignación falla, no puede hacer mucho y simplemente salir / abortar, lo que la excepción hace por usted automáticamente si no prueba / captura explícitamente.

Si usa la versión nothrow , podría terminar propagando un puntero nulo a través de su aplicación y colapsar / salir MUCHO más tarde en un punto que aparentemente no tiene relación alguna con la asignación de memoria, lo que hace que la depuración sea mucho más difícil.