Ako pracovať s dynamickým prideľovaním pamäte C ++?



Tento článok skúma dynamické prideľovanie pamäte v jazyku C ++, čo je dôležitá funkcia, ktorá vám umožní zvážiť vaše pamäťové potreby pre zdroje v reálnom čase.

Dynamická alokácia pamäte V C ++ je veľmi dôležitá funkcia, ktorá vám umožní zvážiť vaše požiadavky a vyrovnať sa s potrebou zdrojov v reálnom čase. V tomto článku by sme mali preskúmať Preskúmanie podrobne. Nasledujúcim ukazovateľom sa budeme venovať v tomto článku,

Začnime teda týmto článkom o dynamickom prideľovaní pamäte v C ++





Potrebujete dynamické prideľovanie pamäte?

Povedzme, že chceme zadať vetu ako pole znakov, ale nie sme si istí presným počtom znakov požadovaným v poli.

Teraz, keď deklarujeme pole znakov, ak zadáme jeho veľkosť menšiu ako veľkosť požadovaného reťazca, dostaneme chybu, pretože priestor v pamäti alokovanej do poľa je menší v porovnaní s veľkosťou vstupného reťazca. Ak zadáme jeho veľkosť väčšiu ako je veľkosť vstupného reťazca, potom bude matici v pamäti pridelený priestor, ktorý je oveľa väčší ako veľkosť požadovaného reťazca, čím zbytočne spotrebuje viac pamäte, aj keď to nie je potrebné.



V uvedenom prípade nemáme predstavu o presnej veľkosti poľa až do času kompilácie (keď počítač skompiluje kód a reťazec zadá používateľ). V takýchto prípadoch používame Nový operátor.

C ++ definuje dvoch unárnych operátorov Nový a vymazať ktoré vykonávajú úlohu prideľovania a prideľovania pamäte počas behu programu. Pretože títo operátori (noví a mazaní) pracujú s voľnou pamäťou pamäte (halda pamäte), hovorí sa im aj operátor voľnej pamäte. Ukazovatele poskytujú potrebnú podporu pre systém dynamického prideľovania pamäte v C ++.

Pomocou dynamickej alokácie môže program získať pamäť počas behu programu.



Globálne a lokálne premenné sú alokované do pamäte počas kompilácie. Počas behu však nemôžeme pridať žiadne globálne ani lokálne premenné. Ak program potrebuje použitie premenlivého množstva pamäte, bolo by potrebné prideliť pamäť počas behu programu, a to podľa potreby. A samozrejme, tu môžu slúžiť dynamické alokačné rutiny.

Rozdiely medzi pridelením statickej pamäte a dynamickým pridelením pamäte:

Toto je základná architektúra pamäte používaná pre akýkoľvek program v C ++:

Pamäť - dynamické prideľovanie pamäte - Edureka

Budeme potrebovať takýto obrázok

Zásobník sa používa na pridelenie statickej pamäte a hromada na dynamické pridelenie pamäte, obe sú uložené v pamäti RAM počítača.

Premenné, ktoré sa pridelia na zásobník, zatiaľ čo sa statické pridelenie pamäte uloží priamo do pamäte a prístup do tejto pamäte je veľmi rýchly, taktiež s jeho pridelením sa zaobchádza pri kompilácii programu. Keď funkcia alebo metóda volá inú funkciu, ktorá by zase mohla volať inú funkciu a tak ďalej, vykonávanie všetkých týchto funkcií zostáva pozastavené, kým posledná funkcia nevráti svoju hodnotu. Zásobník je vždy uložený v poradí LIFO (posledný od prvého von), naposledy rezervovaný blok je vždy ďalším blokom, ktorý sa má uvoľniť. To pomáha udržiavať prehľad o zásobníku. Uvoľnenie bloku zo zásobníka nie je nič iné ako nastavenie jedného ukazovateľa.

Premenné pridelené na halde majú svoju pamäť pridelenú za behu dynamického prideľovania pamäte. Prístup k tejto pamäti je v porovnaní so zásobníkom trochu pomalší, veľkosť haldy je však obmedzená iba veľkosťou virtuálnej pamäte. Prvok haldy nemá vzájomné závislosti a je k nemu kedykoľvek a kedykoľvek možné náhodne získať prístup. Blok môžeme prideliť kedykoľvek a kedykoľvek ho uvoľniť. To sťažuje sledovanie toho, ktoré časti haldy sú v danom okamihu pridelené alebo uvoľnené.

Pokračujeme týmto článkom o dynamickom prideľovaní pamäte v C ++

Alokácia pamäte pomocou Nový Kľúčové slovo

V jazyku C ++ Nový operátor sa používa na pridelenie pamäte za behu a pamäť je pridelená v bajtoch. The Nový operátor označuje požiadavku na dynamické pridelenie pamäte na halde. Ak je k dispozícii dostatok pamäte, potom Nový operátor inicializuje pamäť a vráti adresu novo pridelenej a inicializovanej pamäte do premennej ukazovateľa.

Syntax:

datatype * pointer_name = nový datový typ

Príklad:

int * ptr = new int // Premennú môžeme deklarovať pri dynamickom prideľovaní nasledujúcimi dvoma spôsobmi. int * ptr = new int (10) int * ptr = new int {15} // operátor new sa tiež používa na pridelenie bloku (poľa) pamäte typu data-type. int * ptr = new int [20] // Vyššie uvedený príkaz dynamicky alokuje pamäť na 20 celých čísel nepretržite typu int a vráti ukazovateľ na prvý prvok sekvencie na ukazovateľ „ptr“.

Poznámka : Ak halda nemá dostatok pamäte na alokáciu, nová požiadavka indikuje zlyhanie vyvolaním výnimky std :: bad_alloc, pokiaľ sa s novým operátorom nepoužije „nothrow“, v takom prípade vráti ukazovateľ NULL. Preto je dobrým zvykom pred použitím v programe skontrolovať, či premenná ukazovateľa vyprodukovaná novým nie je nová.

ako používať system.exit v jave

Pokračujeme týmto článkom o dynamickom prideľovaní pamäte v C ++

Vyradenie pamäte pomocou vymazať Kľúčové slovo:

Akonáhle je hromada pamäte pridelená objektu premennej alebo triedy pomocou Nový kľúčové slovo, môžeme tento pamäťový priestor naviazať pomocou vymazať kľúčové slovo.

Syntax:

delete pointer_variable // Pointer_variable je ukazovateľ, ktorý ukazuje na dátový objekt vytvorený novým. delete [] pointer_variable // Na uvoľnenie dynamicky alokovanej pamäte poľa poukázanej pointer-variable použijeme nasledujúcu formu delete:

Príklad:

zmazať ptr zmazať [] ptr

Poznámka : Rozsah alebo životnosť objektu je čas, po ktorý objekt zostáva v pamäti počas vykonávania programu. Alokácia pamäte haldy je pomalšia ako zásobník, pretože v halde neexistuje žiadne konkrétne poradie, v ktorom môžete alokovať pamäť, zatiaľ čo v zásobníku nasleduje LIFO.

Pokračujeme týmto článkom o dynamickom prideľovaní pamäte v C ++

Dynamicky prideľujúce polia

Hlavné využitie konceptu dynamického prideľovania pamäte je na alokovanie pamäte do poľa, keď ho musíme deklarovať zadaním jeho veľkosti, ale nie sme si tým istí.

Pozrime sa na príklad, aby sme pochopili jeho použitie.

#include using namespace std int main () {int len, sum = 0 cout<< 'Enter the no. of students in the class' <>len int * známky = new int [len] // cout dynamického prideľovania pamäte<< 'Enter the marks of each student' << endl for( int i = 0 i>* (značky + i)} pre (int i = 0 i

Vysvetlenie:
V tomto príklade najskôr požiadame používateľa o počet študentov v triede a jeho hodnotu uložíme do premennej len. Potom deklarujeme pole celých čísel a pridelíme mu miesto v pamäti dynamicky rovné hodnote uloženej v premennej len pomocou tohto príkazu int * marks = new int [length], takže je mu pridelený priestor rovný „dĺžke * (veľkosť 1 integer) '. Zvyšok kódu je samozrejmý.

Pokračujeme týmto článkom o dynamickom prideľovaní pamäte v C ++

Dynamické prideľovanie pamäte pre objekty

Môžeme tiež dynamicky alokovať objekty.

Ako vieme, Constructor je špeciálna členská funkcia triedy používaná na inicializáciu objektu a Destructor je tiež členská funkcia triedy, ktorá sa volá vždy, keď objekt vyjde z rozsahu.

sčítanie dvoch čísel v jave

Destruktor je možné použiť na uvoľnenie pamäte priradenej k objektu. Volá sa za nasledujúcich podmienok.

  • Keď miestny objekt vyjde z rozsahu
  • Pre globálny objekt, keď sa operátor použije na ukazovateľ na objekt triedy

Pri dynamickom prideľovaní pamäte objektom môžeme opäť používať ukazovatele.

Pozrime sa na príklad poľa objektov.

#include using namespace std class Random {public: Random () {cout<< 'Constructor' << endl } ~Random() { cout << 'Destructor' << endl } } int main() { Random* a = new Random[3] delete [] a // Delete array return 0 } 

Výkon:

Vysvetlenie:

Konštruktor sa bude volať trikrát, pretože prideľujeme pamäť trom objektom triedy Random. Destruktor bude počas každého z týchto objektov tiež vyvolaný trikrát. „Náhodné * a = nové Náhodné [3]“ toto vyhlásenie je zodpovedné za dynamické pridelenie pamäte nášmu objektu.

Dostali sme sa tak na koniec tohto článku týkajúceho sa dynamickej alokácie pamäte C ++. Ak sa chcete dozvedieť viac, pozrite si Edureka, dôveryhodná online vzdelávacia spoločnosť. Výcvikový a certifikačný kurz Edureka Java J2EE a SOA je navrhnutý tak, aby vás vyškolil na základné aj pokročilé koncepty Java spolu s rôznymi rámcami Java, ako je Hibernate & Spring.

Máte na nás otázku? Uveďte to prosím v sekcii komentárov tohto blogu a my sa vám ozveme čo najskôr.