Válasszuk ketté a resourcek (file, socket, stb.) és a sima objectek kérdését.
Resourcek a Dispose() meghívásakor (vagy a randomnyelv megfelelőjének meghívásakor) felszabadulnak azonnal. Ezzel nincs is probléma. Viszont ugye nem biztos, hogy neked nem fog kelleni a scope elhagyása után a resource (mert mondjuk nyitottál egy hálózati kapcsolatot és azt mondjuk szeretnéd fenntartani a program futása során). Ilyenkor ugye ugyanúgy neked kell kézzel gondoskodni, hogy az bizonyos feltételek esetén lezáródjon. Vélhetőleg ezért oldották meg Java-ban és C#-ban úgy, hogy explicit meg kelljen mondani, hogy mit akarsz Disploseolni és mit nem.
Sima objektek esetén történő refcountolás meg megint érdekes kérdés. Az, hogy ennek nincs költsége, azzal vitatkoznék. Egyrészt minden egyes objektumpéldány esetén fenn kell tartanod plusz memóriahelyet (valószínűleg 4 byte), ahol számolod a referenciák számát. Ezen kívül minden egyes hozzáférésnél/elengedésnél növelni/csökkenteni kell a refcount-ot. Na most ez use-case-től függően akár költségesebb is lehet, mint egy mark&sweep GC. Arról nem beszélve, hogy a GC sokkal általánosabb és több esetet fed le.
----------------
Lvl86 Troll, "hobbifejlesztő" - Think Wishfully™