Если у вас есть:
MyObject *o = NULL;
o->func();
Что будет дальше, зависит от того, является ли func
виртуальным. Если это так, то произойдет сбой, потому что ему нужен объект для получения vtable. Но если он не виртуальный, вызов продолжается с указателем this, установленным в NULL.
Я полагаю, что стандарт говорит, что это "неопределенное поведение", поэтому может произойти все что угодно, но типичные компиляторы просто генерируют код, чтобы не проверять, равен ли указатель NULL. Некоторые хорошо известные библиотеки полагаются на поведение, которое я описал: MFC имеет функцию с именем что-то вроде SafeGetHandle
, которая может вызываться по нулевому указателю, и в этом случае возвращает NULL.
Возможно, вы захотите написать вспомогательную функцию многократного использования:
void CheckNotNull(void *p)
{
if (p == NULL)
throw NullPointerException();
}
Затем вы можете использовать это в начале функции для проверки всех ее аргументов, включая this
:
CheckNotNull(this);