Kuidas töötada dünaamilise mälu eraldamise C ++ abil?



Selles artiklis käsitletakse dünaamilist mälu jaotamist C ++ -s olulist funktsiooni, mis võimaldab teil arvestada oma reaalaja ressursside vajadustega.

Dünaamiline mälu jaotamine C ++ versioonis on väga oluline funktsioon, mis võimaldab teil arvestada oma vajadustega reaalajas ressursside vajaduse rahuldamiseks. Selles artiklis me uurime Uurimine üksikasjalikult. Järgmisi näpunäiteid käsitletakse selles artiklis,

Nii et alustagem selle artikliga dünaamilise mälu jaotamise kohta C ++ -s





Kas vajate dünaamilist mälu eraldamist?

Ütleme nii, et tahame lause sisestada märkide massiivina, kuid me pole kindlad massiivis nõutavate tähemärkide täpse arvu osas.

Kui määrame tähemassiivi deklareerimisel, kui määrame selle suuruse väiksemaks kui soovitud stringi suurus, siis saame vea, kuna massiivile eraldatud mälumaht on sisendistringi suurusega võrreldes väiksem. Kui määrame selle suuruse sisendstringi suurusest suuremaks, eraldatakse massiivile mälus ruumi, mis on palju suurem kui soovitud stringi suurus, kulutades tarbetult rohkem mälu isegi siis, kui seda pole vaja.



Ülaltoodud juhul pole meil massiivi täpse suuruse ideed enne kompileerimise aega (kui arvuti kompileerib koodi ja string sisestatakse kasutaja poolt). Sellistel juhtudel kasutame uus operaator.

C ++ määratleb kaks unaaroperaatorit uus ja kustuta mis täidavad tööaja jooksul mälu eraldamise ja jaotamise ülesannet. Kuna need operaatorid (uued ja kustutatud) töötavad vabamälumälu (kuhjamälu) abil, nimetatakse neid ka tasuta poeoperaatoriteks. Osutajad pakuvad C ++ dünaamilise mälu jaotussüsteemi jaoks vajalikku tuge.

Dünaamilise eraldamise abil saab programm tööaja jooksul mälu hankida.



Üldised ja lokaalsed muutujad eraldatakse kompileerimise ajal mällu. Käitusajal ei saa me aga lisada ühtegi globaalset ega lokaalset muutujat. Kui programm peab kasutama muutuvat mälumahtu, peaksime eraldama mälu käitamise ajal vastavalt vajadusele. Ja muidugi, siin saavad dünaamilised jaotamisrutiinid eesmärki täita.

Staatilise mälu jaotamise ja dünaamilise mälu jaotamise erinevused:

See on põhimäluarhitektuur, mida kasutatakse mis tahes C ++ programmi jaoks:

Mälu - dünaamiline mälu jaotamine - Edureka

Me vajame sellist pilti

Virna kasutatakse staatilise mälu jaotamiseks ja Heap dünaamilise mälu jaotamiseks. Mõlemad on salvestatud arvuti RAM-i.

Muutujad, mis eraldatakse virnale, samal ajal kui staatilise mälu jaotamine salvestatakse otse mällu ja juurdepääs sellele mälule on väga kiire, samuti tegeletakse selle jaotusega programmi koostamisel. Kui funktsioon või meetod kutsub teist funktsiooni, mis võib omakorda kutsuda teise funktsiooni ja nii edasi, jääb kõigi nende funktsioonide täitmine peatatuks, kuni viimane funktsioon tagastab oma väärtuse. Virna salvestatakse alati LIFO (viimane sisse esimene välja) järjekorras, viimati reserveeritud plokk on alati järgmine vabanev plokk. See aitab korstnat jälgida, ploki vabastamine virnast pole midagi muud kui ühe osuti korrigeerimine.

mis on pythonis __init__

Hunnikule eraldatud muutujate mälu eraldatakse käitamise ajal, samal ajal kui dünaamiline mälu eraldamine. Sellele mälule juurdepääs on virnaga võrreldes veidi aeglasem, kuid kuhja suurust piirab ainult virtuaalse mälu suurus. Hunniku elemendil ei ole üksteisest sõltuvust ja sellele pääseb alati juurde suvaliselt igal ajahetkel. Saame ploki igal ajal eraldada ja selle igal ajal vabastada. See teeb keeruliseks jälgida, millistele kuhjaosadele igal ajahetkel eraldatakse või jaotatakse.

Selle artikliga C ++ dünaamilise mälu jaotamise kohta jätkatakse

Mälu eraldamine kasutades uus Märksõna

C ++ versioonis uus operaatorit kasutatakse käituse ajal mälu eraldamiseks ja mälu eraldatakse baitides. The uus operaator tähistab dünaamilise mälu jaotamise taotlust kuhjas. Kui mälu on piisavalt, siis uus operaator vormindab mälu ja tagastab kursori muutujale äsja eraldatud ja initsialiseeritud mälu aadressi.

Süntaks:

andmetüüp * pointer_name = uus andmetüüp

Näide:

int * ptr = new int // Dünaamilise jaotuse korral võime muutuja deklareerida kahel järgmisel viisil. int * ptr = new int (10) int * ptr = new int {15} // uut operaatorit kasutatakse ka andmetüübilise mälu ploki (massiivi) eraldamiseks. int * ptr = new int [20] // Ülaltoodud lause eraldab dünaamiliselt 20 int-tüüpi täisarvu jaoks mälu ja tagastab kursori jada esimesele elemendile osuti ‘ptr’.

Märge : Kui kuhil ei ole eraldamiseks piisavalt mälu, näitab uus taotlus ebaõnnestumist, visates erandi std :: bad_alloc, välja arvatud juhul, kui uue operaatoriga kasutatakse märget „nothrow”, sel juhul tagastab NULL osutaja. Seetõttu on hea tava kontrollida, kui uus on kursori muutuja enne selle kasutamist programmis.

Selle artikliga C ++ dünaamilise mälu jaotamise kohta jätkatakse

Mälu jaotamine kasutades kustuta Märksõna:

Kui hunnik mälu on eraldatud muutujale või klassi objektile, kasutades uus märksõna, saame selle mäluruumi jaotada, kasutades kustuta märksõna.

Süntaks:

kustuta pointer_variable // Siin pointer_variable on kursor, mis osutab uue loodud andmeobjektile. delete [] pointer_variable // Dünaamiliselt eraldatud massiivimälu vabastamiseks, mida osutab muutuja pointer, kasutame järgmist kustutamisvormi:

Näide:

kustuta ptr kustuta [] ptr

Märge : Objekti ulatus või eluiga on aeg, mille jooksul objekt jääb programmi täitmise ajal mällu. Hunnik Mälu eraldamine on aeglasem kui virna, kuna kuhjaga pole konkreetset järjekorda, kus saaksite mälu eraldada, samas kui virnas järgib see LIFO-d.

Selle artikliga C ++ dünaamilise mälu jaotamise kohta jätkatakse

Massiivide dünaamiline eraldamine

Dünaamilise mälu eraldamise mõiste peamine eesmärk on eraldada massiivile mälu, kui peame selle deklareerima, määrates selle suuruse, kuid pole selles kindlad.

Vaatame näite selle kasutamise mõistmiseks.

hägune loogika tehisintellektis
# kaasata nimeruumi kasutamine st int main () {int len, summa = 0 cout<< 'Enter the no. of students in the class' <>len int * mark = uus int [len] // Dünaamiline mälujaotuse väärtus<< 'Enter the marks of each student' << endl for( int i = 0 i>* (märgid + i)} (int i = 0 i

Selgitus:
Selles näites küsime kõigepealt kasutajalt klassi õpilaste arvu ja salvestame selle väärtuse len muutujasse. Seejärel kuulutame täisarvu massiivi ja eraldame selle mällu ruumi dünaamiliselt võrdseks len muutuja salvestatud väärtusega, kasutades seda lauset int * mark = new int [length], seega eraldatakse talle ruum, mis võrdub 'pikkusega * (suurus 1 täisarv) '. Ülejäänud kood on iseenesestmõistetav.

Selle artikliga C ++ dünaamilise mälu jaotamise kohta jätkatakse

Objektide dünaamiline mälu eraldamine

Samuti saame objekte dünaamiliselt eraldada.

Kuna me teame, et Constructor on spetsiaalne klassi liikme funktsioon, mida kasutatakse objekti initsialiseerimiseks, ja Destructor on ka klassi liikme funktsioon, mida kutsutakse alati, kui objekt läheb reguleerimisalast välja.

Destruktorit saab kasutada objektile määratud mälu vabastamiseks. Seda nimetatakse järgmistes tingimustes.

  • Kui kohalik objekt väljub reguleerimisalast
  • Globaalse objekti puhul, kui operaator rakendatakse kursori klassi objektile

Saame jällegi kasutada osuteid, eraldades objektidele dünaamiliselt mälu.

Vaatame objektide massiivi näidet.

#include nimeruumi standardklassi kasutamine Juhuslik {public: Random () {cout<< 'Constructor' << endl } ~Random() { cout << 'Destructor' << endl } } int main() { Random* a = new Random[3] delete [] a // Delete array return 0 } 

Väljund:

Selgitus:

Konstruktorit kutsutakse kolm korda, kuna eraldame mälu klassi Random kolmele objektile. Hävitajat kutsutakse ka nende objektide ajal kolm korda. ‘Juhuslik * a = uus Juhuslik [3]’ vastutab see väide meie objekti dünaamilise mälu jaotamise eest.

Seega oleme jõudnud artiklile ‘Dünaamiline mälu eraldamine C ++’. Kui soovite rohkem teada saada, vaadake järgmist autor Edureka, usaldusväärne veebipõhine õppefirma. Edureka Java J2EE ja SOA koolitus- ja sertifitseerimiskursus on mõeldud selleks, et õpetada teid nii Java-põhimõistete kui ka edasijõudnute kontseptsioonide jaoks koos erinevate Java-raamistikega nagu Hibernate & Spring.

Kas teil on meile küsimus? Palun mainige seda selle ajaveebi kommentaaride jaotises ja võtame teiega ühendust niipea kui võimalik.