Kaip dirbti su dinaminiu atminties paskirstymu C ++?



Šiame straipsnyje nagrinėjama svarbi funkcija Dinaminis atminties paskirstymas programoje C ++, leidžianti atsižvelgti į atminties poreikius, reikalingus realiojo laiko ištekliams.

Dinaminis atminties paskirstymas C ++ yra labai svarbi funkcija, leidžianti apsvarstyti jūsų poreikius, kad būtų galima patenkinti realaus laiko išteklių poreikį. Šiame straipsnyje mes norėtume ištirti Tyrimas išsamiai. Tolimesni rodyklės bus aprašyti šiame straipsnyje,

nuotolinio metodo iškvietimo java pavyzdys

Taigi pradėkime nuo šio straipsnio apie dinaminį atminties paskirstymą C ++





Reikia dinaminio atminties paskirstymo?

Tarkime, mes norime įvesti sakinį kaip simbolių masyvą, tačiau mes nesame tikri dėl tikslaus masyve reikalingo simbolių skaičiaus.

Deklaruodami simbolių masyvą, jei jo dydį nurodysime mažesnį nei norimos eilutės dydis, gausime klaidą, nes masyvui skirta atminties vieta yra mažesnė, palyginti su įvesties eilutės dydžiu. Jei nurodysime jo dydį didesnį nei įvesties eilutės dydis, masyvui atmintyje bus skirta erdvė, kuri yra daug didesnė už norimos eilutės dydį, taigi be reikalo išeikvojama daugiau atminties, net jei jos nereikia.



Ankstesniu atveju mes neturime minties apie tikslų masyvo dydį iki kompiliavimo laiko (kai kompiuteris surenka kodą, o eilutę įveda vartotojas). Tokiais atvejais mes naudojame naujas operatorius.

C ++ apibrėžia du vienarūšius operatorius naujas ir Ištrinti kurie vykdo atminties paskirstymo ir paskirstymo užduotį vykdymo metu. Kadangi šie operatoriai (nauji ir ištrinti) veikia laisvosios atminties atmintyje (kaupiamojoje atmintyje), jie taip pat vadinami nemokamų parduotuvių operatoriais. Rodyklės teikia būtiną palaikymą dinaminei atminties paskirstymo sistemai C ++.

Dinaminio paskirstymo pagalba programa gali gauti atmintį vykdymo metu.



Visuotiniai ir lokalūs kintamieji atminčiai priskiriami kompiliavimo metu. Tačiau vykdymo metu negalime pridėti jokių pasaulinių ar vietinių kintamųjų. Jei programai reikia naudoti kintamą atminties kiekį, mums reikės paskirstyti atmintį vykdymo metu, kaip ir kada reikia. Ir, žinoma, čia dinamiškos paskirstymo rutinos gali pasitarnauti.

Skirtumai tarp statinės atminties ir dinaminės atminties paskirstymo:

Tai yra pagrindinė atminties architektūra, naudojama bet kuriai C ++ programai:

Atmintis - dinaminis atminties paskirstymas - „Edureka“

Mums reikės tokio vaizdo

Šūsnis naudojamas statinei atminčiai paskirstyti, o „Heap“ - dinaminei atminčiai paskirstyti. Jie abu yra saugomi kompiuterio RAM.

Kintamieji, kurie priskiriami kaminui, o statinės atminties paskirstymas saugomas tiesiai į atmintį, o prieiga prie šios atminties yra labai greita, taip pat jo paskirstymas sprendžiamas sudarant programą. Kai funkcija ar metodas iškviečia kitą funkciją, kuri savo ruožtu gali iškviesti kitą funkciją ir pan., Visų šių funkcijų vykdymas lieka sustabdytas, kol paskutinė funkcija grąžins savo vertę. Šūsnis visada saugomas LIFO (paskutinis iš pirmo išėjimo) tvarka, paskutinis rezervuotas blokas visada yra kitas išlaisvinamas blokas. Tai padeda sekti kaminą, išlaisvinti bloką iš kamino yra ne kas kita, kaip koreguoti vieną rodyklę.

Krūvoje paskirstytų kintamųjų atmintis paskirstoma vykdymo metu, tuo tarpu dinaminės atminties paskirstymas. Prieiga prie šios atminties yra šiek tiek lėtesnė, palyginti su kaupu, tačiau kaupo dydį riboja tik virtualiosios atminties dydis. Krūvos elementas neturi priklausomybės vienas nuo kito ir visada gali būti atsitiktinai prieinamas bet kuriuo laiko momentu. Mes galime bet kada paskirstyti bloką ir bet kuriuo metu jį atlaisvinti. Dėl to sunku stebėti, kurios krūvos dalys yra paskirstytos ar paskirstytos bet kuriuo metu.

Toliau su šiuo straipsniu apie dinaminį atminties paskirstymą C ++

Atminties paskirstymas naudojant naujas Raktažodis

C ++ versijoje naujas Operatorius naudojamas paskirstyti atmintį vykdymo metu, o atmintis paskirstoma baitais. The naujas operatorius nurodo prašymą dėl dinaminės atminties paskirstymo kaupe. Jei yra pakankamai atminties, tada naujas operatorius inicijuoja atmintį ir grąžina naujai paskirtos ir inicializuotos atminties adresą į rodiklio kintamąjį.

Sintaksė:

duomenų tipas * pointer_name = naujas duomenų tipas

Pavyzdys:

int * ptr = new int // Dinaminio paskirstymo kintamąjį galime deklaruoti šiais dviem būdais. int * ptr = new int (10) int * ptr = new int {15} // naujas operatorius taip pat naudojamas paskirstyti duomenų tipo atminties bloką (masyvą). int * ptr = new int [20] // Pirmiau pateiktas teiginys dinamiškai paskirsto atmintį 20 sveikų skaičių int tipo nepertraukiamai ir grąžina žymeklį į pirmąjį sekos elementą į „ptr“ žymeklį.

Pastaba : Jei kaupe nėra pakankamai atminties, kad būtų galima paskirstyti, nauja užklausa nurodo nesėkmę išmetant išimtį std :: bad_alloc, nebent su naujuoju operatoriumi naudojama „nothrow“, tokiu atveju jis grąžina NULL rodyklę. Todėl gera praktika yra patikrinti, ar rodyklės kintamasis yra sukurtas naujo, prieš naudojant jį programoje.

Toliau su šiuo straipsniu apie dinaminį atminties paskirstymą C ++

Atminties paskirstymas naudojant Ištrinti Raktažodis:

Kai kaupiklio atmintis bus skirta kintamajam ar klasės objektui, naudojant naujas raktinį žodį, mes galime išspręsti tą atminties vietą naudodami Ištrinti raktinis žodis.

Sintaksė:

ištrinti pointer_variable // Čia pointer_variable yra rodyklė, nukreipianti į duomenų objektą, kurį sukūrė naujas. delete [] pointer_variable // Norėdami atlaisvinti dinamiškai paskirstytą masyvo atmintį, nurodytą rodiklio kintamuoju, naudojame šią ištrinimo formą:

Pavyzdys:

ištrinti ptr ištrinti [] ptr

Pastaba : Objekto apimtis arba objekto gyvenimo trukmė yra laikas, per kurį objektas lieka atmintyje programos vykdymo metu. Krūvos atminties paskirstymas yra lėtesnis nei kamino, nes krūvoje nėra jokios konkrečios tvarkos, kuria galėtumėte paskirstyti atmintį, o šūsnyje ji seka LIFO.

Toliau su šiuo straipsniu apie dinaminį atminties paskirstymą C ++

Dinamiškai paskirstyti masyvus

Pagrindinis dinaminės atminties paskirstymo koncepcijos panaudojimas yra paskirstyti atmintį masyvui, kai turime deklaruoti ją nurodydami jos dydį, bet nesame tikri dėl to.

Pažiūrėkime, pavyzdys, kaip suprasti jo naudojimą.

#include naudojant vardų sritį std int main () {int len, sum = 0 cout<< 'Enter the no. of students in the class' <>len int * markes = new int [len] // Dinaminis atminties paskirstymas<< 'Enter the marks of each student' << endl for( int i = 0 i>* (pažymi + i)} (int i = 0 i

Paaiškinimas:
Šiame pavyzdyje pirmiausia paprašome vartotojo nurodyti mokinių skaičių klasėje ir jo vertę išsaugome kintamajame len. Tada mes paskelbiame sveikojo skaičiaus masyvą ir paskirstome jam atminties vietą dinamiškai lygia vertei, saugomai len kintamajame, naudodami šį teiginį int * ženklai = naujas int [ilgis], taigi jam skiriama erdvė, lygi 'ilgiui * (dydis 1 sveikasis skaičius) “. Likusi kodekso dalis savaime suprantama.

Toliau su šiuo straipsniu apie dinaminį atminties paskirstymą C ++

Dinaminis objektų atminties paskirstymas

Taip pat galime dinamiškai paskirstyti objektus.

Kaip žinome, kad „Constructor“ speciali klasės nario funkcija, naudojama objektui inicializuoti, ir „Destructor“ taip pat yra klasės nario funkcija, kuri iškviečiama, kai objektas išeina iš taikymo srities.

Destruktorius gali būti naudojamas atlaisvinti objektui priskirtą atmintį. Jis vadinamas šiomis sąlygomis.

  • Kai vietinis objektas išeina iš taikymo srities
  • Visuotiniam objektui, kai operatorius pritaikomas žymekliui prie klasės objekto

Mes vėl galime naudoti rodykles, dinamiškai paskirstydami atmintį objektams.

Pažiūrėkime objektų masyvo pavyzdį.

„Android Studio“ pamoka pradedantiesiems
#include naudojant vardų standartinę klasę Random {public: Random () {cout<< 'Constructor' << endl } ~Random() { cout << 'Destructor' << endl } } int main() { Random* a = new Random[3] delete [] a // Delete array return 0 } 

Išvestis:

Paaiškinimas:

Konstruktorius bus iškviestas tris kartus, nes mes skiriame atmintį trims atsitiktinės klasės objektams. Destructor taip pat bus iškviestas tris kartus per kiekvieną iš šių objektų. ‘Random * a = new Random [3]’ šis teiginys yra atsakingas už dinamišką mūsų objekto atminties paskirstymą.

Taigi mes priėjome prie šio straipsnio „Dinaminis atminties paskirstymas C ++“ pabaigos. Jei norite sužinoti daugiau, patikrinkite sukūrė patikima internetinė mokymosi įmonė „Edureka“. „Edureka“ „Java J2EE“ ir SOA mokymo ir sertifikavimo kursai yra skirti mokyti jus tiek pagrindinėms, tiek pažangesnėms „Java“ koncepcijoms kartu su įvairiomis „Java“ sistemomis, tokiomis kaip „Hibernate & Spring“.

Turite mums klausimą? Prašau tai paminėti šio tinklaraščio komentarų skiltyje ir mes kuo greičiau susisieksime su jumis.