А кто тебе сказал, что
getmem(p,sizeof(ob));инициализирует указатель нулем? Ты что, переопределял где-то HeapFunc? По умолчанию GetMem возвращает ненулевой указатель на выделенную область памяти, а при нехватке памяти инициирует RunTime Error, то есть, корректно получить указатель равный Nil с ее помощью - проблематично.
Если TP "замалчивает" ошибку - это еще не значит, что ее нет. Насколько я знаю, эта тема как раз и создавалась для того, чтобы научить избегать подобных ошибок, а не делать их преднамеренно. Есть гораздо более корректный и красивый способ сделать то, что требовалось по условию.