2010-10-10 10 views
5

tengo para interconectar con un código C de C++ constructor de la clase (biblioteca de Intel)Malloc en C++ constructor


    class A{ 
    A{ 
    x = ippiMalloc(); 
    if(x==NULL) ... 
    } 
    } 

En la función constructor malloc (versión de Intel) se utiliza. Si la función ippiMalloc no funciona, ¿cuál es la forma correcta de manejarlo? Lanzar excepción?

+0

¿Qué biblioteca es esta? – rkellerm

+0

Ippi (Primitivas de rendimiento integrado) – Ross

+1

Advertencia si es nuevo en esto: si hay un puntero inteligente de terceros disponible con la semántica de propiedad que desee, quizás 'shared_ptr', luego use eso en lugar de un puntero sin formato. De lo contrario, A debería ser una clase dedicada solo a administrar la asignación y liberación de 'x'. Esto no es solo hada aireada "la separación de preocupaciones es una buena práctica": es sorprendentemente incómodo escribir una clase de excepción segura que es responsable de administrar más de un recurso, y un poco complicado incluso con solo uno ... –

Respuesta

8

Sí, una excepción sería probablemente la forma más adecuada de manejar el error aquí; al menos sería la manera más limpia. Esto es también lo que el "nuevo" operador haría en caso de falla.

Si su aplicación no es consciente de la excepción que usted tiene un problema. En cuyo caso, un método de fábrica en la clase podría tener sentido.

static A * create() { ... } 

Aquí puede ajustar esto en un programa sin excepciones, probablemente devolverá nulo si no puede crear el objeto.

+0

Por otra parte, si su aplicación no es consciente de la devolución, acaba de presentar problemas en lugar de eliminarlos. – MSalters

+0

Si su aplicación no es consciente de la excepción, debe/debe verificar los valores devueltos. Realmente no tienes otra opción: excepciones y/o valores devueltos. –

4

Primero de todo, agregue paréntesis al constructor :) Y sí, yo votaría por lanzar una excepción, porque las alternativas no son muy agradables, como establecer algún bool en clase como object_state_is_not valid o algo así.

1

Unirse a las respuestas anteriores - y here es una buena explicación sobre por qué las excepciones son la mejor forma de manejar errores en los constructores. (C++ FAQ Lite)