When a polygon is freed, we thus decrease the instance counter for it's vertices. Whenever a vertex is known to be unused, it can be freed safely. And it might even be useful to add an instance counter to the polygon class. Note that a polygon with four vertices now takes 32 bytes of memory more than the original version, but only if it's vertices and coordinates are not shared by any other polygon. In practice, each coordinate is shared by at least three polygons, so the extra space goes down to 20 bytes.
Vertices are often unique.
The variable sized vertex pointer arrays. In a portal engine, this might be more, but no polygon will get more complex than about 20 vertices. For each possible size of the vertex pointer array, we use a separate list. This requires some tricky code, of course. The first pointer in this piece of memory is considered to be the 'next' pointer.