2011-01-17 20 views

Respuesta

1

http://www.cplusplus.com/reference/std/new/nothrow/

Esta construcción se usa raramente, porque sospecho que en realidad no afecta al rendimiento de asignación de memoria, en lugar pueden ser utilizados por conveniencia.

Aún así, normalmente se prefiere la variante genérica.

9

Según tengo entendido, prácticamente nunca y ninguno.

9

Trasladar un programa de C a C++. Su programa C tiene todos esos controles allí, después de cada malloc, y ninguna noción de excepciones. Por lo tanto, es mucho más simple cambiar cada malloc a nuevo (nothrow) que envolver cada malloc en un bloque try.

+12

¿No es aún más simple dejarlos como 'malloc'? Incluso en C++, 'malloc' no tira. –

+0

@Steve Jessop, ¿hay alguna garantía de que 'malloc' y' free' trabajen juntos? Si no, podría ser el más simple de convertir para que pueda ser consistente. –

+3

@Mark: No estoy seguro de lo que quiere decir "trabajar juntos". Si el código C no libera todo lo que mallocs, entonces la corrección de errores está separada de portarlo. Si hay una biblioteca C en la memoria de 'Malloc' y le deja a la persona que llama' libre', entonces los clientes de la versión C++ pueden preferir 'eliminar' en su lugar, * pero * cambiando la interfaz de esa manera usted tiene que hacer cambios en cualquier código C++ que ya estaba usando la versión C anterior. Supongo que podría estar de acuerdo con el cambio por esa razón, suponiendo que no existe ese código C++ existente. Desagradable interfaz, sin embargo, hay mejores formas de mejorarla para la versión de C++. –

3

Sé que había versiones anteriores de C++ (específicamente de Microsoft) que no arrojaban cuando no podían asignar la memoria, pero en su lugar devolvían NULL. Esta sería una forma fácil de mantener la compatibilidad con el código anterior en lugar de cambiar toda la lógica.

+3

AFAIK no es Microsoft, es solo la forma en que funcionaba el nuevo C++ pre-estándar antes de que se introdujeran las excepciones. – ybungalobill

+0

Tizen OS no es compatible con el manejo de excepciones estándar. Usan nothrow junto con el constructor de dos fases. – bikram990

4

Tal vez si su aplicación requirió nano-optimización y no pudo permitir la sobrecarga de manejo de excepciones, entonces tal vez nothrow sería necesario.

tener en cuenta que BS es bastante firme en que el programador puede apagar sobrecarga en C++. (Como advertencia, el hecho de que tenga la opción no significa que deba hacerlo).

4

Usted usa std :: nothrow cuando desea tener que verificar el valor nulo después de cada nuevo. Una gran cantidad de código heredado lo necesitaba cuando se hizo la primera versión del estándar. Una gran cantidad de código heredado escrito después también lo usa porque la gente está paranoica de excepciones. Ocasionalmente te encontrarás con alguien que todavía está.

Es muy raro que realmente quieras hacer esto, incluso me tomó un segundo recordar la WTF de la que hablabas.

1

Me imagino que esto se puede utilizar como una optimización de ruta rápida con asignadores personalizados; por ejemplo, fallar la solicitud actual y hacer crecer la agrupación en algún momento posterior/inactivo. Prácticamente un caso de esquina.

11

Lo usaría solo como una optimización (o simplificación de código) cuando de otro modo habría puesto un bloque try-catch inmediatamente alrededor de un uso de nuevo regular, capturando std::bad_alloc.

Esta es una situación bastante rara, porque es raro poder manejar de manera útil la falta de memoria allí mismo en el sitio de llamadas. Por lo general, asigna memoria porque la necesita, no porque le gustaría tenerla, pero puede vivir sin ella. El código que pasa punteros nulos respalda una cadena de llamantes hasta que, finalmente, alguien puede resolver el problema no es idiomático C++.

Puede suceder sin embargo que el error realmente puede ser manejado de inmediato. Por ejemplo, es posible que se encuentre en una situación en la que utilizará un algoritmo o técnica con suficiente espacio de trabajo y un algoritmo o técnica diferente y más lenta sin él. Por otra parte, ¿estaría asignando dicho espacio de trabajo directamente con new? No normalmente. Y de todos modos, a veces hay que tener cuidado con este enfoque, porque si sus overcommits OS entonces, en general, que no puede mango fuera de la memoria con gracia a nivel de aplicación.

Tenga en cuenta que una expresión que implica std :: nothrow todavía puede lanzar una excepción (en particular, de cualquier constructor del objeto que está siendo asignado), por lo que es uno que se necesita si usted está esperando para evitar lanzar una excepción. También debes asegurarte de que el constructor no lanzará.

Por lo que a mí respecta, los días de los programas en C++ que no usan excepciones, han terminado. Supongo que si se reanudaron para mí, debido a una guía de estilo particular, entonces esa es la otra razón probable para no necesitar nada nuevo.

+0

¿Qué tiene que ver esta respuesta con la pregunta? La pregunta era sobre std :: nothrow y no sobre métodos que no arrojan excepciones. – kingston

-2

Solo unos pocos programas deberían asignar más de 1 GiB de memoria y, dado que los sistemas modernos sobrepasan la memoria, new nunca devolverán nulo o arrojarán estos sistemas. Por lo tanto, no tiene ningún sentido verificar el valor de retorno de new/malloc. Solo mantén tu huella de memoria y deja que el asesino sin memoria derribe otros procesos.

Cuestiones relacionadas