Aqui esta el primer error:
q:=p;
q hace referencia a un pedazo de memoria que reservaste, pero como le asignas otro valor simplemente ya no podrás liberar ese fragmento de memoria por que ninguna otra variable tiene almacenada dicha información.
Por lo tanto el segundo error es:
dispose(q);
Por querer liberar una zona de memoria que ya liberaste puesto que q apunta a la misma zona de memoria que acabaste de liberar con dispose(p);
Si quieres que funcione sin remover "q:=p;" tienes que quitar:
new(q);
y
dispose(q);