Kicsit cikis a konkluzio azert. Azt mondani, hogy az rc rossz, a gc jo, feluletes. Nezzuk sorban az erveket:
- Hogy alsobbrendu lenne az rc? Nem feltetlenul. Egyreszt lenyegesen egyszerubb az mukodese, trivialisan szalbiztossa teheto. Es valami, amit a gc sosem fog tudni: determinisztikus a mukodese. Hogy ez miert is erdekes, arrol majd lejjebb. Az, amibe itt hibakent botlottal, az inkabb tekintheto a c egy limitaciojanak. Ugyanis itt hianyzik a pl. C++-ban mar jelen levo stack alapu destruktor mechanizmus, ami igen komoly garanciakat biztosit a programozonak, az eroforrasok preciz es korrekt kezelesere (RAII).
- Korkoros referenciak: igen, nagyon feluletesen nezve ez az a dolog, amit az rc nem tud kezelni, de a gc meg automatikusan megoldja, anelkul, hogy erre gondolni kellene, ugye? Hat nem. Egyreszt praktikusan minden referenciaszamlalt nyelvben letezik a gyenge referencia fogalma (pl. c++-ban a std::weak_ptr), amivel ezt a jelenseget meg lehet kerulni, vagy valaszthatja a programozo, hogy a kort "explicit" modon szakitja meg (valamit nullptr-re allit). Ezzel olyat nyer, amit a gc sosem tud biztositani: onnantol kezdve az eroforrasok felszabaditasanak helye es ideje determinisztikussa valik. Azaz nem felszabadul "majd valamikor", hanem pontosan lehet tudni a helyet/helyeket. Ezen felul gc kodban a destruktorok eseten a kulso referenciakkal ugy kell banni, mint a himes tojasokkal (leginkabb az a good practice, hogy kulso referenciakra nem hivatkozunk a destruktorban, vagy nem is irunk destruktort, mert kiszamithatatlan/nemdeterminisztikus).
- Kivetelek felszabaditas soran. Disclaimer: "children, don't try this at home". Nem batoritok senkit arra, hogy olyan destruktorokat irjon, amik kiveteleket dobalnak, de ez C++-ban egy valid dolog es van nemi haszna is esetenkent. Na ezt pl. gc nyelvben megintcsak nem lehet megjatszani, mert a destruktorbol dobott kivetel nemigen tud hol landolni, gondolom, ha senki nem kapja el, akkor a runtime-ban vegzi, ami vagy elnyeli, vagy terminalja a programot, egyik sem nyero.
- Egeszen biztosan nem szamit "dilettans modszernek" az rc, ha valahol ezt tanultad, akkor dobd el a konyvet messzire. A gc es az rc ugyanarra a problemara ad megoldast csak a trade-off-ok mashol vannak. Vannak produktiv rc nyelvek (c++11, obj-c, swift), es vannak produktiv gc nyelvek (C#, java, haskell, ...). Es most hagy legyek egy kicsit inkorrekt: eppen pont nem a java programok hiresek arrol, hogy a memoriat milyen korrekten es konzervativan kezelnek ;) (eclipse? tomcat? ismerosen csengenek ;)).