Sí. Si pregunta por qué no devuelve una referencia, ya que las referencias son más bonitas que las indicadoras, la respuesta es patrimonio histórico.
Cuando C++ estaba en desarrollo, si la máquina no podía obtener memoria para el objeto, se devolvía un puntero especial NULL
. Esto es lo que se hace en C:
SomeClass *person;
person = (SomeClass*) malloc(sizeof(SomeClass));
if (person == NULL) fprintf(stderr, "no more people allowed!");
En C++ estándar, los errores son devueltos por excepción en su lugar:
try {
SomeClass *person = new SomeClass;
// do something
} catch (std::bad_alloc) {
std::cerr << "no more people!" << std::endl;
} catch (...) {
// using exceptions allows for other errors
// from inside SomeClass::SomeClass too
}
Todavía puede hacerlo de la manera antigua, sin embargo, con nothrow
:
SomeClass *person = new(std::nothrow) SomeClass;
if (person == NULL) std::cerr << "no more people allowed!" << std::endl;
El resultado es, esto es perfectamente razonable y un buen estilo:
SomeClass &person = * new SomeClass; // don't need no stinkin pointers!
Véase también http://stackoverflow.com/questions/2697892/. – sbi