object = 0;
delete(object);
object = 0; убрать. Потому что в теле оператора delete стоит проверка на нулевой аргумент, который приводит к простому выходу из тела оператора. Поэтому кажется, что все работает.
if (pCurrent->id ==2)
{
pCurrent->age = 666;
PersonDeleteObject(pCurrent);
}
заменяешь на
if (pCurrent->id ==2)
{
pCurrent->age = 666;
Person* toDestroy = pCurrent;
pCurrent = pCurrent->pNext;
PersonDeleteObject(toDestroy);
}
Почему именно так - разбирайся сам с дебаггером, коли решил глубоко изучать.
ЗЫ. return писать не надо, если функция возвращает void.
ЗЗЫ. Ты что, действительно, пишешь с таким форматированием (точнее, без него)?!