Mis on C ++ prügivedu?

Prügivedu on mäluhaldusmeetod. See on eraldi automaatne mäluhaldusmeetod, mida kasutatakse programmeerimiskeeltes, kus käsitsi mäluhaldust ei eelistata ega tehta. Manuaalse mäluhaldusmeetodi puhul peab kasutaja mainima kasutatavat mälu, mida saab eraldada, seevastu prügikoguja kogub mälu, mille hõivavad muutujad või objektid, mida programmis enam ei kasutata. Prügikogujad haldavad ainult mälu. Prügikoguja ei käsitle muid ressursse, näiteks hävitajad, kasutajatoimingu aken ega failid.

Vähesed keeled vajavad hea tõhususe tagamiseks keele osana prügivedajaid. Neid keeli nimetatakse prügikogutud keelteks. Näiteks Java, C # ja enamik skriptikeeli vajavad nende toimimiseks prügivedu. Sellised keeled nagu C ja C ++ toetavad käsitsi mäluhaldust, mis toimib sarnaselt prügivedajale. Nii prügivedu kui ka käsitsi hallatava mälu jaotamist / jaotamist toetavaid keeli on vähe ja sellistel puhkudel eraldatakse prügikogujale ja käsitsi mälule eraldi kuhi mälu.

Mõningaid vigu saab ära hoida, kui kasutatakse prügivedu. Nagu näiteks:

  • rippuva osuti probleem, milles osutatud mälu on juba eraldatud, samas kui kursor jääb alles ja osutab erinevatele uuesti määratud andmetele või juba kustutatud mälule
  • probleem, mis ilmneb siis, kui proovime kustutada või eraldada mälu, mis on juba kustutatud või mõnele muule objektile ümber paigutatud, teist korda
  • eemaldab andmestruktuuridega seotud probleemid või vead ning tõhustab mälu ja andmete käsitsemist
  • mälulekkeid või mälu ammendumise probleeme saab vältida

Vaatame üksikasjalikku teavet käsitsi mäluhalduse ja prügiveo kohta, plussidest, miinustest ja selle rakendamisest C ++ -s.

Mälu käsitsi haldamine

Dünamiliselt eraldatud mälu kogu hunnikust jooksmise ajal tuleb vabastada, kui me selle mälu kasutamise lõpetame. Dünaamiliselt eraldatud mälu võtab mälu hunnikust, mis on mälu vaba ladu.

C ++ -s toimub see mälu eraldamine ja tehingute paigutamine käsitsi, kasutades käske nagu uus, kustuta. Uue mälu kasutamine eraldatakse kuhjaga. Pärast selle kasutamist tuleb see mälu kustutada käsu 'Kustuta' abil.

Iga mälu eraldamine numbriga „uus” tuleb lõpetada käsuga „kustutada“. Kui ei, siis kaob meil mälu.

Selle selge näitamiseks näitega:

n = uus näidisobjekt;
******* kasutamine on siin rakendatud *******
kustuta n;

Nagu näidatud, peaks iga uus lõpp lõppema või kalduma kustutamiskäsklusega. Siin eraldatakse n osutile mälu, kasutades käsku 'new', ja sellele osutatakse või osutatakse objektile, mille nimi on 'sample_object'. Kui osuti kasutamine ja toimimine on lõpule viidud, peaksime mälu vabastama või vabastama, kasutades ülaltoodud käsku 'Kustuta'.

Prügiveo korral eraldatakse mälu käsul 'new', kuid seda ei pea käsitsi vabastama 'delete' abil. Sellistel juhtudel kontrollib prügivedaja perioodiliselt vaba mälu olemasolu. Kui mõni mälu ei ole ühegi objektiga suunatud, tühjendab see mälu või vabastab selle, luues rohkem vaba ruumi.

Käsitsi mäluhalduse eelised ja puudused

Manuaalse mäluhalduse eelisteks on see, et kasutajal oleks täielik kontroll nii operatsioonide eraldamise kui ka tehingute jaotamise üle ning ta teaks ka seda, millal uus mälu on eraldatud ja millal see eraldatakse või vabastatakse. Kuid prügiveo korral vabastatakse mälu täpselt pärast kasutamist mälu, kui see perioodilise toimingu ajal kokku puutub.

Ka käsitsi mäluhalduse korral helistatakse hävitajale samal hetkel, kui kutsume käsku 'Kustuta'. Kuid prügivedaja puhul, mida pole rakendatud.

Manuaalse mäluhalduse kasutamisega on seotud mõned probleemid. Mõnikord kipume hõivatud mälu topelt kustutama. Juba kustutatud osuti või mälu kustutamisel on tõenäoline, et osuti osutab mõnele muule andmetele ja võib olla kasutusel.

Veel üks probleem, mis meil käsitsi mäluhalduses on, on see, et kui uue mälu jaoks eraldatud osuti täitmisel või kasutamisel saame erandi, siis läheb see välja uue ja kustutamise järjestusest ning vabastamistoimingut ei tehta. läbi viidud. Samuti võib tekkida probleeme mälulekkega.

Prügivedaja eelised ja puudused

Prügiveo üks peamisi puudusi on kasutamata mälu leidmiseks ja kustutamiseks kuluv aeg või protsessoritsüklid, isegi kui kasutaja teab, millise osuti mälu saab vabastada ja mida mitte kasutada. Veel üks puudus on see, et me ei tea aega, millal see kustutatakse või millal hävitaja kutsutakse.

Prügi kogumise algoritm

Prügivedude algoritme on palju, näiteks viidete loendamine, märkimine ja pühkimine, kopeerimine jne. Parema mõistmise huvides vaatame üksikasjalikult ühte algoritmi. Näiteks kui näeme võrdlusarvestuse algoritmi, on igal dünaamilisel mälul viidete arv. Kui viide luuakse, suureneb viite arv ja iga viite kustutamisel seda vähendatakse. Kui viitearv muutub nulliks, näitab see, et mälu on kasutamata ja selle saab vabastada.

Seda algoritmi saab C ++ -s rakendada, kasutades konkreetset osuti tüüpi. Tuleks deklareerida konkreetne osuti tüüp ja seda saab kasutada näiteks kõigi loodud viidete jälgimiseks, viidete loomisel ja kustutamisel viitearvu jälgimiseks. C ++ programm võib sisaldada nii käsitsi mäluhaldust kui ka samas programmis toimuvat prügivedu. Vastavalt vajadusele saab kasutada kas tavalist osuti või konkreetset prügivedaja osutit.

Kokkuvõtlikult võib öelda, et prügivedu on käsitsi mäluhaldusele vastupidine meetod. Prügikogus vabastatakse mälu automaatselt perioodilise ajavahemiku alusel või konkreetsete kriteeriumide alusel, mis teavad, kas seda enam ei kasutata. Mõlemal meetodil on oma eelised ja puudused. Seda saab vastavalt funktsiooni keerukusele rakendada ja kasutada sõltuvalt kasutatavast keelest ja selle ulatusest.

Soovitatavad artiklid

See on C ++ prügikogumise juhend. Siin käsitleme käsitsi mäluhaldust ja prügiveo algoritmi koos eeliste ja puudustega. Lisateavet leiate ka meie muudest soovitatud artiklitest -

  1. Konstruktor ja hävitaja Java-s
  2. C ++ keelufunktsioonid
  3. Hävitaja Java-s
  4. C ++ rakendused reaalses maailmas
  5. C ++ 11 peamist funktsiooni ja eelist

Kategooria: