Promiň, ale začíná mi připadat, že se nějak zásadně nechápeme ohledně využití shared_ptr.
Když je objekt "rovnocenně" vlastněn několika jinými, tak potřebuju evidovat, že ho stále někdo drží a až zmizí poslední vlastník, tak musí být uvolněn i ten objekt. Pokud mám GC, tak mi tuto evidenci pořeší a mám to bez práce. Pokud ne, tak se přímo k tomu nabízí shared_ptr, protože přesně tohle dělá, akorát je to dost drahé. Mohl bych si to dělat ručně někde bokem, ale v zásadě bych jen simuloval to počítadlo referencí co už je v tom shared, takže by to nejspíš bylo ještě dražší.
Ano, ale pokud polygony vlastní své nody, tak proč by je neměly vlastnit přes unique_ptr a ostatním dávat obyčejný pointer?
Ano, GC to za tebe pořeší a ty to máš bez práce... ale jak to ten GC pod kapotou asi dělá...? 
Když polygon uvolní svůj node, tak všechny pointery na něj se stanou nefunkčními. Proto je zpravidla výhodnější shared_ptr. Při zániku polygonu zaniknou jen ty nody, které už nemají žádnou další referenci.
shared_ptr je vlastně mezivrstvou obsluhovanou na úrovni jazyka, syntaktickým cukrem. Když si to někdo chce obsloužit ve vlastní režii, ...
GC bych do toho netahal, ten s tím nemá nic společného.