Kuinka työskennellä dynaamisen muistin allokoinnin C ++ kanssa?



Tässä artikkelissa tarkastellaan Dynaamista muistin allokointia C ++: ssa, joka on tärkeä ominaisuus, jonka avulla voit ottaa huomioon reaaliaikaisten resurssien muistitarpeet.

Dynaaminen muistin allokointi C ++: ssa on erittäin tärkeä ominaisuus, jonka avulla voit harkita vaatimuksiasi reaaliaikaisten resurssien tarpeen käsittelemiseksi. Tässä artikkelissa olisimme tutkimassa Etsintä yksityiskohtaisesti. Seuraavat viitteet käsitellään tässä artikkelissa,

Joten aloitetaan tämän artikkelin kanssa Dynaaminen muistin allokointi C ++: ssa





Tarvitsetko dynaamista muistin allokointia?

Sanotaan, haluamme syöttää lauseen merkistöinä, mutta emme ole varmoja taulukossa vaadittavien merkkien tarkasta määrästä.

Kun määritämme merkkimatriisin, määritämme sen koon pienemmäksi kuin halutun merkkijonon koko, niin saat virheilmoituksen, koska taulukkoon varattu muistin tila on pienempi kuin syötemerkkijonon koko. Jos määritämme sen koon suuremman kuin syötemerkkijonon koko, matriisille varataan muistissa tila, joka on paljon suurempi kuin halutun merkkijonon koko, mikä kuluttaa tarpeettomasti enemmän muistia, vaikka sitä ei tarvita.



Edellä mainitussa tapauksessa meillä ei ole ajatusta taulukon tarkasta koosta ennen kääntöaikaa (kun tietokone kääntää koodin ja merkkijono syötetään käyttäjän toimesta). Tällaisissa tapauksissa käytämme Uusi operaattori.

C ++ määrittelee kaksi unaarista operaattoria Uusi ja poistaa jotka suorittavat muistin varaamisen ja jakamisen tehtävän ajon aikana. Koska nämä operaattorit (uusi ja poista) toimivat vapaan tallennuksen muistilla (kasan muisti), niitä kutsutaan myös vapaan kaupan operaattoreiksi. Osoittimet tarjoavat tarvittavan tuen dynaamiselle muistinjakojärjestelmälle C ++: ssa.

Dynaamisen allokoinnin avulla ohjelma voi hankkia muistia ajon aikana.



Globaalit ja paikalliset muuttujat varataan muistiin kääntöajan aikana. Emme kuitenkaan voi lisätä mitään globaaleja tai paikallisia muuttujia ajon aikana. Jos ohjelman on käytettävä vaihtelevaa määrää muistia, meidän on allokoitava muisti ajon aikana tarpeen mukaan. Ja tietysti tässä dynaamiset allokointirutiinit voivat palvella tarkoitusta.

Staattisen muistin ja dynaamisen muistin allokoinnin erot:

Tämä on perusmuistiarkkitehtuuri, jota käytetään mihin tahansa C ++ -ohjelmaan:

Muisti - Dynaaminen muistin allokointi - Edureka

Tarvitsemme tällaisen kuvan

Pinoa käytetään staattiseen muistiin ja Heap dynaamiseen muistiin, molempia tallennetaan tietokoneen RAM-muistiin.

Muuttujat, jotka varataan pinolle, kun staattinen muistin allokointi tallennetaan suoraan muistiin ja pääsy tähän muistiin on erittäin nopeaa, myös sen allokointi käsitellään ohjelmaa käännettäessä. Kun funktio tai menetelmä kutsuu toista toimintoa, joka puolestaan ​​voi kutsua toisen toiminnon ja niin edelleen, kaikkien näiden toimintojen suorittaminen pysyy keskeytettynä, kunnes viimeinen funktio palauttaa arvonsa. Pino tallennetaan aina LIFO-järjestyksessä (viimeinen ensin ulos), viimeksi varattu lohko on aina seuraava vapautettava lohko. Tämä auttaa seuraamaan pinoa, lohkon vapauttaminen pinosta ei ole muuta kuin yhden osoittimen säätäminen.

Kasaan varattujen muuttujien muisti on varattu ajon aikana samalla kun dynaaminen muistin allokointi. Tämän muistin käyttö on hieman hitaampaa kuin pino, mutta kasan kokoa rajoittaa vain virtuaalimuistin koko. Kasan elementillä ei ole riippuvuutta toisistaan, ja siihen pääsee aina satunnaisesti milloin tahansa. Voimme jakaa lohkon milloin tahansa ja vapauttaa sen milloin tahansa. Tämän vuoksi on vaikea seurata, mitkä kasan osat on jaettu tai jaettu kulloinkin.

ero käyttöliittymän ja luokan välillä

Siirrytään tähän artikkeliin Dynaaminen muistin allokointi C ++: ssa

Muistin allokointi käyttämällä Uusi Avainsana

C ++: ssa Uusi operaattoria käytetään varaamaan muistia ajon aikana ja muisti varataan tavuina. Uusi operaattori tarkoittaa pyyntöä dynaamisen muistin allokoimiseksi kasaan. Jos muistia on riittävästi, Uusi operaattori alustaa muistin ja palauttaa äskettäin varatun ja alustetun muistin osoitteen osoitemuuttujaan.

Syntaksi:

datatyyppi * pointer_name = uusi tietotyyppi

Esimerkki:

int * ptr = new int // Voimme ilmoittaa muuttujan dynaamisen allokoinnin aikana kahdella seuraavalla tavalla. int * ptr = uusi int (10) int * ptr = uusi int {15} // uutta operaattoria käytetään myös varaamaan tietotyyppisen muistilohko (matriisi). int * ptr = new int [20] // Yllä oleva lauseke varaa dynaamisesti muistia 20 kokonaisluvulle, jotka ovat jatkuvasti int-tyyppisiä, ja palauttaa osoittimen sekvenssin ensimmäiselle elementille ptr-osoittimeen.

Huomautus : Jos kasalla ei ole tarpeeksi muistia varaamiseen, uusi pyyntö ilmoittaa epäonnistumisesta heittämällä poikkeuksen std :: bad_alloc, ellei uuden operaattorin kanssa käytetä “nothrow”, jolloin se palauttaa NULL-osoittimen. Siksi on hyvä käytäntö tarkistaa uuden tuottama osoitinmuuttuja ennen sen käyttöä ohjelmassa.

Siirrytään tähän artikkeliin Dynaaminen muistin allokointi C ++: ssa

Muistin jakaminen käyttämällä poistaa Avainsana:

Kun kasa muisti on varattu muuttujalle tai luokkaobjektille Uusi avainsanalla, voimme jakaa tämän muistitilan käyttämällä poistaa avainsana.

Syntaksi:

delete pointer_variable // Tässä pointer_variable on osoitin, joka osoittaa uuden luomaan dataobjektiin. delete [] pointer_variable // Dynaamisesti allokoidun taulukon muistin vapauttamiseksi osoittimen muuttujan avulla käytämme seuraavaa poistomuotoa:

Esimerkki:

poista ptr poista [] ptr

Huomautus : Kohteen laajuus tai objektin käyttöikä on aika, jonka kohde pysyy muistissa ohjelman suorituksen aikana. Kasan muistin allokointi on hitaampaa kuin pino, koska kasassa ei ole erityistä järjestystä, jossa voit jakaa muistia, kun taas pinossa se seuraa LIFO: ta.

Siirrytään tähän artikkeliin Dynaaminen muistin allokointi C ++: ssa

Dynaamisesti jakamalla taulukot

Dynaamisen muistin allokoinnin käsitteen pääasiallinen käyttö on muistin varaaminen taulukkoon, kun meidän on ilmoitettava se määrittelemällä sen koko, mutta emme ole varmoja siitä.

Katsotaanpa esimerkki sen käytön ymmärtämiseksi.

#include käyttämällä nimiavaruutta std int main () {int len, summa = 0 cout<< 'Enter the no. of students in the class' <>len int * mark = uusi int [len] // Dynaamisen muistin allokointi<< 'Enter the marks of each student' << endl for( int i = 0 i>* (merkit + i)} (int i = 0 i

Selitys:
Tässä esimerkissä kysytään ensin käyttäjältä luokan opiskelijoiden määrää ja tallennamme sen arvon len-muuttujaan. Sitten julistetaan kokonaislukumatriisi ja varaamme sille muistissa olevan tilan dynaamisesti yhtä suureksi kuin len-muuttujaan tallennettu arvo käyttämällä tätä lausetta int * marks = new int [length], joten sille varataan väli, joka on yhtä suuri kuin 'pituus * (koko 1 kokonaisluku)'. Loput koodista ovat itsestään selviä.

c ++ lajittelulista

Siirrytään tähän artikkeliin Dynaaminen muistin allokointi C ++: ssa

Objektien dynaaminen muistin allokointi

Voimme myös kohdistaa kohteet dynaamisesti.

Kuten tiedämme, että Constructor-erikoisluokan jäsentoiminto, jota käytetään objektin alustamiseen, ja Destructor on myös luokan jäsenfunktio, jota kutsutaan aina, kun objekti menee suoja-alasta.

Hävittäjää voidaan käyttää objektille osoitetun muistin vapauttamiseen. Sitä kutsutaan seuraavissa olosuhteissa.

  • Kun paikallinen objekti menee soveltamisalan ulkopuolelle
  • Globaalille objektille, kun operaattoria lisätään osoittimeen luokan kohteeseen

Voimme jälleen käyttää osoittimia samalla kun varaamme dynaamisesti muistia esineille.

Katsotaanpa esimerkki joukosta esineitä.

#include käyttämällä nimiavaruuden vakioluokkaa Satunnainen {public: Random () {cout<< 'Constructor' << endl } ~Random() { cout << 'Destructor' << endl } } int main() { Random* a = new Random[3] delete [] a // Delete array return 0 } 

Tuotos:

Selitys:

Rakentajaa kutsutaan kolme kertaa, koska jaamme muistia kolmelle Random-luokan objektille. Hävittäjää kutsutaan myös kolme kertaa kunkin objektin aikana. ‘Satunnainen * a = uusi satunnainen [3]’ tämä lausunto on vastuussa objektin dynaamisesta muistin allokoinnista.

Siksi olemme päässeet tämän artikkelin 'Dynaaminen muistin allokointi C ++' -kohtaan. Jos haluat oppia lisää, tutustu Edureka, luotettava verkko-oppimisyritys. Edurekan Java J2EE- ja SOA-koulutus- ja sertifiointikurssit on suunniteltu kouluttamaan sekä ydin- että edistyneitä Java-konsepteja sekä erilaisia ​​Java-kehyksiä, kuten Hibernate & Spring.

Onko sinulla kysymys meille? Mainitse se tämän blogin kommenttiosassa ja otamme sinuun yhteyttä mahdollisimman pian.