Раз концепция доказала, значит в Вашем трансляторе можно будет указать (например, как я бы видел):
## Код:
```
PtrNoFree = POINTER TO RECORD [untagged]
    next: PtrNoFree
END;
PtrRefCount = POINTER TO RECORD [strong] 
    next: PtrRefCount
END;
PtrGC = POINTER TO RECORD
    next: PtrGC
END;
...
    NEW(p); p.next := p;
...
    (* p.next := NIL *) p := NIL;
```

И сгенерить код, в котором, при отсутствии внешних ссылок:
- В первом случае PtrNoFree память не освобождается;
- Во втором случае PtrRefCount освобождение не произойдет, потому, что есть ссылка сама на себя. Но, если раскомментировать и разорвать ссылку, то освобождение произойдет немедленно при p := NIL;
- В третьем случае PtrGC сборщик мусора позже в idle-цикле освободит память.