2011-01-06 12 views
9

En un proyecto escolar mío, se me solicitó crear un programa que no utilizaba STL.
En el programa que utilizo un montón deExcepciones de mala asignación en C++

Pointer* = new Something; 
if (Pointer == NULL) throw AllocationError(); 

Mi pregunta es acerca de los errores de asignación:
1. ¿hay una excepción automática lanzada por nueva asignación cuando se produce un error?
2. en caso afirmativo, ¿cómo puedo capturarlo si no estoy usando STL (#include "exception.h)
3. está usando la prueba NULL enugh?

gracias.
estoy usando eclipseCDT (C++) con MinGW en Windows 7.

Respuesta

10

Sí, el nuevo operador lanzará automáticamente una excepción si no puede asignar la memoria.

A menos que su compilador lo deshabilite de alguna manera, el nuevo nunca devolverá un puntero NULL.

Lanza una excepción bad_alloc.

También hay una versión nueva de nothrow que puede utilizar:

int *p = new(nothrow) int(3); 

esta versión devuelve un puntero nulo si la memoria no puede ser asignado. Pero también tenga en cuenta que esto no garantiza un 100% nothrow, porque el constructor del objeto aún puede arrojar excepciones.

poco más de información: http://msdn.microsoft.com/en-us/library/stxdwfae(VS.71).aspx

3
  1. hay una excepción lanzada por autamtic nueva asignación cuando falla?
  2. si es así, ¿cómo puedo cogerlo si no estoy usando STL (# include exception.h")

Sí. Vea este ejemplo. También demuestra cómo atrapar la excepción!

try 
    { 
    int* myarray= new int[10000]; 
    } 
    catch (bad_alloc& ba) 
    { 
    cerr << "bad_alloc caught: " << ba.what() << endl; 
    } 

A partir de aquí: http://www.cplusplus.com/reference/std/new/bad_alloc/

3 está usando la prueba NULL es lo suficiente bueno

0.?

No es necesario, a menos que sobrecargue el operador new!

0

Estándar nueva emite una excepción bad_alloc en caso de fallo, por lo que su cheque isnt nula necesario.

1
  1. Sí: std :: bad_alloc

  2. En mi opinión, que no es parte de la STL más que el operador es nueva. (Podría atrapar ... pero perderá la posibilidad de descriminar con otras excepciones).

  3. No es necesario, nuevo lanzará una excepción y no devolverá NULL.

0

Depende antiguo compilador de C++ proporcionan la set_new_handler para atrapar error de asignación. También puedes ver la excepción bad_alloc.

http://en.wikipedia.org/wiki/New_%28C%2B%2B%29

Si desea controlar esto también se puede anular el operator new/operator delete par

1

estándar de C++ se produce una excepción si la memoria solicitada no puede ser asignado. Si quieres NULL en lugar de la excepción a continuación, la sintaxis es

Whatever *p = new (std::nothrow) Whatever; 

Esta sintaxis es sólo un caso de "nueva ubicación" de asignación que permite una función de asignador para recibir parámetros.

La mayoría de las veces que he comprobado NULL después de new es en código de Visual C++, donde el comportamiento predeterminado de ::operator new es devolver NULL en lugar de generar una excepción como exige el estándar (esta es IMO una de las muchas áreas en las que Microsoft intentó (¿aún está intentando?) luchar contra códigos portátiles).