Hice algunas investigaciones después de aprender new
, a diferencia de malloc()
al cual estoy acostumbrado, no devuelve NULL para las asignaciones fallidas, y encontré que hay dos formas distintas de verificar si el nuevo tuvo éxito o no. Estas dos formas son:Nuevo (std :: nothrow) vs. Nuevo dentro de un bloque try/catch
try
{
ptr = new int[1024];
}
catch(std::bad_alloc& exc)
{
assert();
};
y
ptr = new (std::nothrow) int[1024];
if(ptr == NULL)
assert();
Creo que las dos formas de lograr el mismo objetivo, (! Corrígeme si estoy equivocado, por supuesto), por lo que mi pregunta es la siguiente:
que es la mejor opción para comprobar si new
tuvo éxito, basado enteramente en la legibilidad, la mantenibilidad y el rendimiento, sin tener en cuenta la convención de programación de C++ de facto.
Use excepciones. Hacen que su código sea más significativo, local, sostenible y escalable. –
Respecto a la legibilidad solamente, definitivamente el que sin excepción maneja. En cuanto al rendimiento, tal vez también el 'nohrow'. Pero estoy seguro de que los ex-excepcionistas discutirán. Pero si solo quiere una falla de aserción simple, también puede usar la variante de lanzamiento y omitir el manejador de excepciones;) –
¿Cuál es el objetivo de ese código? Estás atrapando una excepción específica y significativa y luego creando una sin sentido a través de 'assert()' ... – Blindy