Dinamično dodeljevanje pomnilnika v C++

Dinamicno Dodeljevanje Pomnilnika V C



Običajno pri uporabi izvornih kod v programskem jeziku C++ prevajalnik ročno dodeli pomnilnik spremenljivki za shranjevanje podatkov. Šlo naj bi za dodelitev statičnega pomnilnika. To je fiksni pomnilnik, ki ga ni mogoče spremeniti, ko je deklariran. Za to vrsto dodeljevanja pomnilnika operacijski sistem uporablja sklad za shranjevanje podatkov. Pri statični dodelitvi je pomnilnik dodeljen, preden se izvorna koda začne izvajati.

Medtem ko se pri dinamični dodelitvi pomnilnika pomnilnik dodeli, ko se je izvajanje začelo. Ta pomnilnik ročno dodeli programer med izvajanjem, kar je v C++ znano tudi kot dodelitev pomnilnika med izvajanjem. Velikost dinamičnega pomnilnika lahko spremenite na katerem koli mestu v programu, ker v času deklaracije ne omenjamo velikosti, ki jo je mogoče popraviti. Vrednost posredujemo le neposredno spremenljivki.

Razlika v dodelitvi pomnilnika normalnim spremenljivkam

Pri običajnih spremenljivkah se pomnilnik, ki ga dodeli prevajalnik, samodejno dodeli in sprosti. Ko programer dinamično dodeli pomnilnik, ga mora nato odstraniti ali sprostiti, ko ni več uporaben pri nadaljnjem izvajanju izvorne kode. Ta situacija povzroči 'puščanje pomnilnika', ko se program prekine, medtem ko pomnilnik ni sprostil.







Operatorji za dinamično dodeljevanje

V C++ dva operaterja pomagata pri dodeljevanju in sprostitvi pomnilnika: 'new' in 'delete', ki se uporabljata za boljše dodeljevanje in sprostitev pomnilnika.



Nov operater

Označuje zahtevo po dodelitvi pomnilnika. Operator new inicializira pomnilnik in vrne naslov tega dodeljenega pomnilnika spremenljivki kazalca, če je na voljo dovolj pomnilnika.



Objekt kazalca = novo podatke - vrsta ;

Izbriši operaterja

Tako kot operator new se tudi operator delete uporablja za odstranitev dodeljenega pomnilnika. V C++ lahko programer uporabi ta operator za sprostitev.





# Izbriši pointer_variable;

Primer 1

V tem primeru bomo predstavili dva kazalca: eden je kazalec tipa celega števila, drugi pa je kazalec plavajočega tipa. Kazalci so inicializirani z uporabo znaka zvezdice z njimi.

# Int * pointInt;
# Float *pointfloat;

Z uporabo teh dveh tiskalnikov bomo dinamično dodeljevali pomnilnik.



Vloga kazalcev pri dinamičnem dodeljevanju:
Pomnilnik prostora za shranjevanje je razvit v obliki blokov. Kadar koli izvedemo program ali izvedemo katero koli operacijo, je pomnilnik dodeljen za ta namen. Ta pomnilnik ima poseben naslov, ki je povezan s programom, ki identificira, kateremu procesu ali programu je dovoljen ta pomnilnik. Do katere koli pomnilniške reže lahko dostopate prek naslova, ki mu pripada. Torej je ta naslov shranjen prek kazalcev. Skratka, potrebujemo kazalce za dostop do pomnilnika in na enak način za dodelitev določenega dela pomnilnika kateri koli nalogi. Kazalci so potrebni za shranjevanje naslovov.

Ker se ključna beseda 'novo' uporablja za dinamično dodeljevanje pomnilnika pri ročni dodelitvi, pomnilnik dodeli prevajalnik. Med izvajanjem nam ni treba dodeljevati pomnilnika. Ker pa je dinamična dodelitev naključna, moramo identificirati kazalce in za postopek vezave se uporabi ta novi operator.

# Pointint = novo int;

Podobno je vezan tudi plavajoči kazalec. Po postopku vezave bomo pomnilniku dodelili poljubno vrednost, ki jo želimo rezervirati za katero koli operacijo. Z deklaracijo kazalca pomnilniku dodelimo določeno vrednost.

# *pointInt = 50;

Navedena je tudi vrednost float za točke floats. Prikaz vrednosti po dodelitvi.

Kot smo že omenili, se operater 'novo' uporablja za dodeljevanje, medtem ko se 'izbriši' uporablja za sprostitev pomnilnika. Ko torej dokončate nalogo ali operacijo v kodi, bomo odstranili pomnilnik, ki smo ga dodelili nalogi.

Bolje je sprostiti ta del pomnilnika, tako da ga lahko izkoristi kateri koli drug proces. To dodelitev bomo uporabili za oba kazalca.

Izbriši točko lebdi ;

Ko shranite kodo v urejevalnik besedila, vam terminal Ubuntu omogoča izvajanje izvorne kode znotraj datoteke prek prevajalnika g++.

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

Po izvedbi boste videli vrednosti, dodeljene pomnilniku.

Primer 2

Ta primer vključuje interakcijo uporabnika. Vzeli bomo številsko spremenljivko, ki bo vsebovala vrednost od uporabnika. Ta program bo rezultat shranil v GPA študentov. Vsi rezultati bodo shranjeni med izvajanjem.

Ko uporabnik vnese število študentov, se pomnilnik dodeli vsaki številki. Tukaj je inicializiran kazalec tipa plavajočega tipa, ki bo uporabljen pri dodelitvi pomnilnika rezultatov.

Kazalec vzamemo v float, ker je GPA v decimalnem zapisu. Za GPA vzamemo matriko tipa kazalca, saj lahko povzroči več študentov.

Ptr = novo lebdi [ na enem ]

Ta niz kazalcev s ključno besedo 'novo' bo povezal izvedbo s pomnilnikom. Povprečni uspeh bo vpisan za vsakega študenta. Ker nismo seznanjeni s številom študentov, ki jih želi uporabnik dodati, smo uporabili zanko for za vnos GPA do vnesenega števila. Pri vsaki ponovitvi zanke mora uporabnik vnesti rezultat, ki identificira študenta. Ko je rezultat shranjen, bomo znova uporabili zanko za prikaz vseh GPA učencev. Na koncu se matrika tipa kazalca izbriše, saj je bil namen dinamičnega shranjevanja dosežen.

Izbriši [ ] ptr ;

Zdaj bomo izvedli zgoraj omenjeno kodo. Uporabnik bo najprej pozvan, da vnese število študentov. Nato bo vpisan povprečni uspeh vsakega študenta.

Primer 3

Ta primer uporablja operatorje new in delete za objekt razreda. Ta razred vsebuje zasebno spremenljivko celoštevilskega tipa, ki shranjuje starost. V javnem delu razreda se ustvari konstruktor, ki bo inicializiral starost na številko '10'. Tukaj je uporabljena druga funkcija, ki bo prikazala starost, ki je inicializirana v konstruktorju.

Zdaj bomo šli proti glavnemu programu za dinamično dodelitev. Objekt razreda je ustvarjen dinamično.

študent * ptr = novo študent ( ) ;

Ko je objekt oblikovan, bo konstruktor samodejno implementiran. Za pridobitev starosti bo izveden klic funkcije. To bo storjeno prek ptr.

Ptr - > getAge ( ) ;

In na koncu se bo spomin sprostil.

Zaključek

Dinamično dodeljevanje pomnilnika dodeli programer med izvajanjem v času izvajanja namesto fiksnega pomnilnika, ki ga določi prevajalnik. Ta dodelitev je naključna in jo je mogoče odstraniti po uporabi. Medtem ko se v večini primerov pred odstranitvijo postopek izvajanja ustavi in ​​ta dinamična dodelitev nato povzroči puščanje pomnilnika. Ta pojav smo implementirali v različne pristope v sistemu Ubuntu Linux z uporabo programskega jezika C++.