Mikä on C ++ -jätteenkeräys?

Roskakori on muistinhallintatekniikka. Se on erillinen automaattinen muistinhallintamenetelmä, jota käytetään ohjelmointikielissä, joissa manuaalista muistinhallintaa ei suositeta tai suoriteta. Manuaalisessa muistinhallintamenetelmässä käyttäjän on mainittava käytössä oleva muisti, joka voidaan jakaa uudelleen, kun taas roskakeräjä kerää muistin, jonka käyttävät muuttujat tai esineet, joita ei enää käytetä ohjelmassa. Vain muistia hallitsevat roskien kerääjät. Muita resursseja, kuten hävittäjiä, käyttäjän vuorovaikutusikkunaa tai tiedostoja, jätekeräilijä ei käsittele.

Harva kieli tarvitsee jätteen keräilijöitä osana kieltä hyvän tehokkuuden saavuttamiseksi. Näitä kieliä kutsutaan roskien kerätyiksi kieliksi. Esimerkiksi Java, C # ja suurin osa komentosarjojen kielistä tarvitsevat roskien keräämisen osana niiden toimintaa. Kun taas kielet, kuten C ja C ++, tukevat manuaalista muistinhallintaa, joka toimii samalla tavalla kuin roskienkeräin. Harvat kielet tukevat sekä roskien keruuta että manuaalisesti hallittua muistin allokointia / kaupankäyntiä, ja tällaisissa tapauksissa jätekeräimelle ja manuaaliselle muistille osoitetaan erillinen muistikasa.

Jotkut virheet voidaan estää, kun jätekeräysmenetelmää käytetään. Kuten:

  • roikkuvan osoittimen ongelma, jossa osoitettu muisti on jo varattu, kun taas osoitin pysyy edelleen ja osoittaa erilaisiin uudelleen osoitettuihin tietoihin tai jo poistettuihin muistoihin
  • ongelma, joka ilmenee, kun yritämme poistaa tai käsitellä uudelleen muistia, joka on jo poistettu tai siirretty toiselle objektille
  • poistaa tietorakenteisiin liittyvät ongelmat tai virheet ja hoitaa muistin ja tiedonkäsittelyn tehokkaasti
  • muistivuodot tai muistin tyhjenemisongelmat voidaan välttää

Katsotaanpa yksityiskohtainen käsitys manuaalisesta muistinhallinnasta vs. roskien keräyksestä, eduista, haitoista ja kuinka se toteutetaan C ++: ssa.

Manuaalinen muistin hallinta

Dynaamisesti varattu muisti ajoaikana kasasta on vapautettava, kun lopetamme sen käytön. Dynaamisesti varattu muisti vie muistin kasasta, joka on muistin vapaa tallennustila.

C ++: ssa tämä muistin allokointi ja jakaminen tehdään manuaalisesti komennoilla, kuten uudet, poista. 'Uuden' muistin käyttö allokoidaan kasasta. Sen käytön jälkeen tämä muisti on tyhjennettävä 'poista' -komennolla.

Jokainen 'uusi' -muistialue on viimeistelty 'poista' -komennolla. Jos ei, menetämme muistin.

Voit näyttää sen selvästi esimerkillä:

n = uusi näyteobjekti;
******* käyttö toteutetaan täällä *******
poista n;

Kuten kuvassa, jokaisen uuden tulee loppua tai kallistua poistamiskomennolla. Tässä n osoittimelle osoitetaan muisti 'new' -komennolla, ja siihen viitataan tai osoitetaan kohteeseen, jonka nimi on 'sample_object'. Kun osoittimen käyttö ja toiminta on valmis, meidän pitäisi vapauttaa muisti tai vapauttaa se käyttämällä 'poista' -komentoa yllä kuvatulla tavalla.

Mutta jos roskat kerätään, muisti allokoidaan 'uusi' -komennolla, mutta sitä ei tarvitse vapauttaa manuaalisesti 'poistamalla'. Tällöin jätekeräjä tarkistaa säännöllisesti vapaan muistin varalta. Kun mikään esine ei osoita muistin palautusta, se tyhjentää tai vapauttaa muistin, jolloin syntyy enemmän vapaata kasa-tilaa.

Manuaalisen muistinhallinnan edut ja haitat

Manuaalisen muistinhallinnan etuna on, että käyttäjällä on täydellinen hallinta sekä allokoinnin että jakamisen operaatioiden suhteen, ja hän myös tietää, milloin uusi muisti on allokoitu ja milloin se on allokoitu tai vapautettu. Mutta roskien keräyksen tapauksessa, samalla tavalla käyttökerran jälkeen muistia ei vapauteta, se vapautuu, kun se kohtaa sen määräajoin tapahtuvan toiminnan aikana.

Myös manuaalisen muistinhallinnan tapauksessa hävittäjää kutsutaan samaan aikaan kun kutsumme 'poista' -komentoa. Mutta jos jätekeräilijä ei ole toteutettu.

Muistin manuaaliseen hallintaan liittyy muutamia ongelmia. Joskus meillä on taipumus kaksinkertaisesti poistaa käytössä oleva muisti. Kun poistamme jo poistetun osoittimen tai muistin, on mahdollista, että osoitin viittaa johonkin muuhun tietoon ja että se voi olla käytössä.

Toinen ongelma, joka meillä on manuaalisessa muistinhallinnassa, on, että jos saamme poikkeuksen uuden muistin allokoidun osoittimen suorittamisen tai käytön aikana, se sammuu 'uuden' ja 'poista' -sekvenssien joukosta eikä vapautusoperaatiota ole. suoritettu. Muistivuotoja voi myös olla.

Roskakorin edut ja haitat

Yksi jätteiden keräyksen suuri haitta on käyttämättömän muistin löytämiseen ja poistamiseen käytetty aika tai suorittimen jaksot, vaikka käyttäjä tietäisi, mikä osoitinmuisti voidaan vapauttaa ja jota ei käytetä. Toinen haittapuoli on, ettemme tiedä aikaa, jolloin se poistetaan tai milloin hävittäjää kutsutaan.

Roskakorin algoritmi

On olemassa monia roskienkeräysalgoritmeja, kuten viitelaskenta, merkitseminen ja pyyhkäisy, kopiointi jne. Katsotaanpa yksi algoritmi yksityiskohtaisemmin ymmärtämistä varten. Esimerkiksi kun näemme viitelaskentaalgoritmin, jokaisella dynaamisella muistilla on viitelaskenta. Kun referenssi luodaan, referenssimäärä lisääntyy ja aina kun referenssi poistetaan, referenssimäärä vähenee. Kun viitearvo muuttuu nollaksi, se osoittaa, että muistia ei ole käytetty ja että se voidaan vapauttaa.

Tämä algoritmi voidaan toteuttaa C ++: ssa tietyn osoittintyypin avulla. Tietty osoittintyyppi olisi ilmoitettava, ja sitä voidaan käyttää esimerkiksi luomien viitteiden seuraamiseen, viitelaskennan seuraamiseen, kun viite luodaan ja poistetaan. C ++ -ohjelma voi sisältää sekä manuaalisen muistinhallinnan että samassa ohjelmassa tapahtuvan roskien keräyksen. Tarpeen mukaan voidaan käyttää joko normaalia osoitinta tai tiettyä roskakorin osoitinta.

Yhteenvetona voidaan todeta, että jätteiden keruu on menetelmä, joka on vastakohta manuaaliseen muistin hallintaan. Roskakorissa muisti vapautetaan automaattisesti määräajoin tai tiettyjen kriteerien perusteella, jotka ilmoittavat, onko sitä enää käytetty. Molemmilla menetelmillä on omat edut ja haitat. Tämä voidaan toteuttaa ja käyttää toiminnon monimutkaisuuden mukaan käytetystä kielestä ja sen laajuudesta riippuen.

Suositellut artikkelit

Tämä on opas C ++ -jätteenkeräykseen. Tässä keskustellaan manuaalisesta muistinhallinnasta ja jätteiden keräysalgoritmista sekä eduista ja haitoista. Voit myös käydä läpi muiden ehdotettujen artikkeleidemme saadaksesi lisätietoja -

  1. Rakentaja ja tuhoaja Java
  2. C ++ -merkkijonotoiminnot
  3. Tuhoaja Java
  4. C ++: n sovellukset todellisessa maailmassa
  5. C ++: n 11 tärkeintä ominaisuutta ja hyötyä