Miten C++:lla kirjoitetaan roskakerättyä koodia?
Smart pointer:sit yms.
Roskienkeräys tarkoittaa yleensä sitä, että erillinen roskienkerääjä käy joillain ehdoilla läpi muistialueet ja vapauttaa käytöstä poistuneet. C++23 ei sisällä tällaista roskienkeräystä.
C++ sisältää luokan shared_ptr, joka toimii niin, että kun viimeinen samaan muistialueeseen osoittava shared_ptr tuhoutuu, muistialue vapautetaan. Kun osoittimesta on tehty shared_ptr, kyseinen shared_ptr ja sen kopiot ovat vastuussa vapauttamisesta. Toinen riippumaton shared_ptr samasta osoittimesta on kielletty.
C++ sisältää luokan weak_ptr, johon voi tallettaa shared_ptr:n mutta joka ei estä muistin vapauttamista. Tällä voi välttää sykliset shared_ptr-viittaukset, jotka muuten estäisivät muistin automaattisen vapauttamisen.
C++ sisältää luokan unique_ptr, joka on vähän kuin shared_ptr mutta sallii vain yhden samanaikaisen omistajan, eli jos arvon sijoittaa toiseen osoittimeen, ensimmäinen tyhjenee.
Mutta eikös GC:n suurin etu ole scopetettujen asioiden kanssa? Ja silloin se on myös tehokkain.
Ajattelin, että jos voisi kirjoittaa C++:aa ilman manuaalista hallintaa siten, että suunnittelee vaan scopet hyvin.
mavavilj kirjoitti:
Ajattelin, että jos voisi kirjoittaa C++:aa ilman manuaalista hallintaa siten, että suunnittelee vaan scopet hyvin.
Tervetuloa tälle vuosituhannelle. RAII on kuitenkin eri asia kuin roskienkeräys.
jlaire kirjoitti:
mavavilj kirjoitti:
Ajattelin, että jos voisi kirjoittaa C++:aa ilman manuaalista hallintaa siten, että suunnittelee vaan scopet hyvin.
Tervetuloa tälle vuosituhannelle. RAII on kuitenkin eri asia kuin roskienkeräys.
Niin ja sitten mietimme, miksi tarvitaan roskienkerääjää?
Eli miltä näyttää C++, joka on Javamaista?
Eikös Valgrind ole kätevä etsimään noita muistivuotoja koodista(?):
https://valgrind.org/
Aihe on jo aika vanha, joten et voi enää vastata siihen.