2011-08-14 12 views
11

He visto que los recursos muestran dos formas de asignar memoria al mismo tiempo que se garantiza que haya suficiente memoria para completar la operación.cómo asignar correctamente la memoria en C++ en condiciones de poca memoria

1) Papel de la 'nueva' operación en un try/catch ya que regresará std :: bad_alloc (?)

try { ptr = new unsigned char[num_bytes]; } catch(...) {} 

2) comprobar el puntero nulo asignado para después de la 'nueva' operación .

ptr = new unsigned char[num_bytes]; if(ptr == NULL) { ... } 

¿Cuál es la correcta? ¿Ambos trabajan? ¿Debo hacer tal vez 1 y 2?

Gracias,

JBU

Respuesta

16

Si está utilizando la implementación estándar de new que arroja una excepción, la primera es correcta.

también puede utilizar la segunda si se utiliza nothrow como:

ptr = new (nothrow) unsigned char[num_bytes]; 
if(ptr == NULL) { ... } 
+1

oooh esto es quizás lo que debería hacer en su lugar, para reducir la cantidad de código que necesitaré cambiar. – jbu

+0

@jbu: también tenga en cuenta que algunos códigos se compilan con excepciones desactivadas. Esto no es estándar, y en este caso necesitará leer el documento del compilador, pero es probable que 'nuevo' devuelva 0 si falla. –

5

una asignación no tiene éxito [usando new] lanza std::bad_aloc, por lo que la primera es la correcta.

la 2da se usa para el código c, cuando se usa malloc [dado que no hay excepciones en C, se usó NULL para indicar que la asignación falló].

cuando se utiliza new, la instrucción if nunca se cumplirá, ya que si la asignación fallara, se lanzará una excepción y no se alcanzará la instrucción if. y, por supuesto, cuando la asignación es exitosa, la sentencia if dará como resultado falsa.

+2

Un buen consejo en general, pero muchos ++ plataformas incrustado c don' t admite excepciones, y esas son aquellas en las que la memoria baja realmente es más preocupante. –

+0

"pero muchas plataformas C++ incrustadas no admiten excepciones": entonces no son compatibles con C++, sino con un lenguaje similar a C++. Las excepciones son parte del estándar C++. – Raedwald

0
try { ptr = new unsigned car[num_bytes]; } 
catch(std::bad_alloc& e) { cerr << "error: " << e.what() << endl; } 

El segundo idioma es más apropiado para malloc

Cuestiones relacionadas