Si usted tiene:
MyObject *o = NULL;
o->func();
Lo que sucede después depende de si es func
virtual. Si es así, se bloqueará, porque necesita un objeto para obtener el vtable. Pero si no es virtual, la llamada continúa con este puntero establecido en NULL.
Creo que el estándar dice que esto es un "comportamiento indefinido", por lo que cualquier cosa podría pasar, pero los compiladores típicos simplemente generan el código para no verificar si el puntero es NULL. Algunas bibliotecas bien conocidas se basan en el comportamiento que describí: MFC tiene una función llamada algo así como SafeGetHandle
que se puede invocar con un puntero nulo y devuelve NULL en ese caso.
Es posible que desee escribir una función auxiliar reutilizable:
void CheckNotNull(void *p)
{
if (p == NULL)
throw NullPointerException();
}
entonces usted puede utilizar que, al inicio de una función para comprobar todos sus argumentos, incluyendo this
:
CheckNotNull(this);
¿Es esto específico para .net? - Es posible que desee cambiar la etiqueta, muchos usuarios de C++ van a filtrar .net –
NullPointerException me hace creer que esto no es una cuestión de C++ en absoluto. DO#? – Tom