Dinaminis atminties paskirstymas C++

Dinaminis Atminties Paskirstymas C



Paprastai, naudodamas šaltinio kodus C++ programavimo kalba, kompiliatorius rankiniu būdu paskirsto atmintį kintamajam duomenims saugoti. Sakoma, kad tai yra statinės atminties paskirstymas. Tai fiksuota atmintis, kurios paskelbus negalima pakeisti. Šio tipo atminties paskirstymui operacinė sistema naudoja krūvą duomenims saugoti. Atliekant statinį paskirstymą, atmintis paskirstoma prieš pradedant vykdyti šaltinio kodą.

Tuo tarpu dinaminio atminties paskirstymo metu atmintis paskirstoma, kai prasideda vykdymas. Šią atmintį programuotojas rankiniu būdu paskirsto vykdymo metu, taip pat žinomas kaip vykdymo laiko atminties paskirstymas C++. Dinaminės atminties dydis gali būti keičiamas bet kurioje programos vietoje, nes deklaravimo metu neminome dydžio, kurį būtų galima pataisyti. Mes pateikiame tik vertę tiesiogiai kintamajam.

Atminties paskirstymo ir įprastų kintamųjų skirtumas

Įprastuose kintamuosiuose atmintis, kurią paskirsto kompiliatorius, paskirstoma ir išskirstoma automatiškai. Kai programuotojas dinamiškai paskirsto atmintį, jis turi pašalinti arba atlaisvinti atmintį, kai ji yra nenaudinga tolesniam šaltinio kodo vykdymui. Ši situacija sukelia „atminties nutekėjimą“, kai programa nutraukiama, kol atmintis nėra atlaisvinta.







Dinaminio paskirstymo operatoriai

C++ kalboje du operatoriai padeda paskirstyti atmintį ir išskirstyti: „naujas“ ir „ištrinti“, kurie naudojami atminčiai geriau paskirstyti ir išskirstyti.



Naujas operatorius

Tai reiškia atminties paskirstymo poreikį. Naujasis operatorius inicijuoja atmintį ir grąžina tos skirtos atminties adresą žymeklio kintamajam, jei yra pakankamai atminties.



Rodyklės objektas = naujas duomenis - tipo ;

Ištrinti operatorių

Kaip ir naujasis operatorius, ištrynimo operatorius naudojamas skirtas atminčiai pašalinti. C++ kalboje programuotojas gali naudoti šį operatorių paskirstymui.





# Ištrinti pointer_variable;

1 pavyzdys

Šiame pavyzdyje pristatysime dvi rodykles: viena yra sveikojo skaičiaus tipo rodyklė, o kita - slankioji rodyklė. Rodyklės inicijuojamos naudojant žvaigždutės ženklą.

# Int * pointInt;
# Plūduriuoti *pointfloat;

Naudodami šiuos du spausdintuvus dinamiškai paskirstysime atmintį.



Rodyklės vaidmuo dinaminiame paskirstyme:
Saugojimo vietos atmintis išvystyta blokų pavidalu. Kai vykdome programą ar atliekame bet kokią operaciją, atmintis yra skirta tam konkrečiam tikslui. Ši atmintis turi specialų adresą, susietą su programa, kuri identifikuoja, kuris procesas ar programa yra leidžiama į tą atmintį. Bet kuri atminties vieta pasiekiama per adresą, kuriam jis priklauso. Taigi šis adresas yra saugomas per rodykles. Trumpai tariant, mums reikia rodyklių, kad galėtume pasiekti atmintį ir tuo pačiu būdu paskirti tam tikrą atminties dalį bet kokiai užduočiai. Rodyklės reikalingos adresams saugoti.

Kadangi raktinis žodis „naujas“ naudojamas dinaminiam atminties paskirstymui rankiniu būdu, atmintį paskirsto kompiliatorius. Mums nereikia skirti atminties vykdymo metu. Tačiau kadangi dinaminis paskirstymas yra atsitiktinis, turime nustatyti nuorodas ir susiejimo procesui naudojamas šis naujas operatorius.

# Pointint = naujas int;

Panašiai slankioji žymeklis yra susietas taip pat. Po susiejimo proceso priskirsime bet kokią reikšmę atminčiai, kurią norime rezervuoti bet kuriai operacijai. Deklaruodami rodyklę, atminčiai priskiriame konkrečią reikšmę.

# *pointInt = 50;

Taip pat deklaruojama taško slankioji vertė. Rodyti reikšmes po priskyrimo.

Kaip jau aptarėme, „naujas“ operatorius naudojamas paskirstyti, o „ištrinti“ naudojamas atminčiai panaikinti. Taigi, kai atliksite užduotį ar operaciją kode, pašalinsime atmintį, kurią skyrėme užduočiai.

Geriau paskirstyti tą atminties dalį, kad bet kuris kitas procesas galėtų tuo pasinaudoti. Taikysime šį paskirstymą abiem rodyklėms.

Ištrinti tašką plūdė ;

Išsaugojus kodą teksto rengyklėje, Ubuntu terminalas leidžia vykdyti šaltinio kodą faile per g++ kompiliatorių.

$ g++ -o mem mem.c
$ ./mem

Vykdydami pamatysite atminčiai priskirtas reikšmes.

2 pavyzdys

Šis pavyzdys apima vartotojo sąveiką. Mes paimsime skaičiaus kintamąjį, kuriame bus vartotojo reikšmė. Ši programa išsaugos rezultatus studentų GPA. Visi rezultatai bus išsaugoti vykdymo metu.

Kai vartotojas įveda mokinių skaičių, kiekvienam skaičiui priskiriama atmintis. Čia inicijuojamas slankiojo tipo žymeklis, kuris bus naudojamas rezultatų paskirstymui atmintyje.

Rodyklės žymeklį imame plūduriuojančiu režimu, nes GPA yra dešimtainio žymėjimo tvarka. Mes naudojame žymiklio tipo masyvą, skirtą GPA, nes tai gali atsirasti daugeliui studentų.

Ptr = naujas plūdė [ ant vieno ]

Šis rodyklės masyvas su raktiniu žodžiu „naujas“ susies vykdymą su atmintimi. GPA bus įvestas kiekvienam studentui. Kadangi nesame susipažinę su studentų, kuriuos vartotojas nori įtraukti, skaičiumi, GPA įvesti iki įvesto skaičiaus panaudojome for kilpą. Kiekvieno ciklo kartojimo metu vartotojo prašoma įvesti rezultatą, identifikuojantį studentą. Išsaugoję rezultatą, vėl naudosime kilpą, kad būtų rodomi visi studentų GPA. Galų gale rodyklės tipo masyvas ištrinamas, nes buvo pasiektas dinaminės saugojimo tikslas.

Ištrinti [ ] ptr ;

Dabar vykdysime aukščiau minėtą kodą. Pirmiausia vartotojo bus paprašyta įvesti studentų skaičių. Tada bus įvestas kiekvieno studento GPA.

3 pavyzdys

Šiame pavyzdyje klasės objektui naudojami nauji ir trynimo operatoriai. Šioje klasėje yra privatus sveikojo skaičiaus kintamasis, kuriame saugomas amžius. Viešoje klasės dalyje sukuriamas konstruktorius, kuris inicijuoja amžių iki skaičiaus „10“. Čia naudojama kita funkcija, kuri parodys amžių, kuris inicijuotas konstruktoriuje.

Dabar pereisime prie pagrindinės dinaminio paskirstymo programos. Klasės objektas kuriamas dinamiškai.

Studentas * ptr = naujas studentas ( ) ;

Suformavus objektą konstruktorius bus realizuotas automatiškai. Norint sužinoti amžių, bus atliktas funkcijos skambutis. Tai bus padaryta per ptr.

Ptr - > getAge ( ) ;

Ir pabaigoje atmintis bus išlaisvinta.

Išvada

Dinaminį atminties paskirstymą vykdymo metu paskirsto programuotojas, o ne fiksuota saugykla, kurią nustato kompiliatorius. Šis paskirstymas yra atsitiktinis ir gali būti pašalintas jį panaudojus. Tuo tarpu daugeliu atvejų prieš pašalinimą vykdymo procesas sustabdomas ir dėl šio dinaminio paskirstymo atsiranda atminties nutekėjimo. Šį reiškinį įgyvendinome įvairiais būdais Ubuntu Linux sistemoje, naudodami C++ programavimo kalbą.