Да, это очевидно что стек затёрт чём-то, потому так сложно определить, где именно был вылет... За эту версию говорит и тот факт, что сам объект CG2Neighbour (я уверен, что других объектов быть не может т.к. включён только протокол G2) уже удалён или повреждён так сильно, что вызов виртуальной функции OnRead() приводит к "вызову" (или так разворачивается повреждённый стек отладчиком) не в CG2Neighbour::OnRead(), а CG1Neighbour::OnRead().
Ну, как я и предполагал, я затупил ... Всё указывало на использование уже удалённого объекта, но я не верил и не смог увидеть, что это явно происходит 10 строчками ниже...