Kā strādāt ar dinamisko atmiņas piešķiršanu C ++?



Šajā rakstā ir izpētīta svarīga funkcija Dinamiskā atmiņas sadale C ++ versijā, kas ļauj apsvērt atmiņas vajadzības pēc reāllaika resursiem.

Dinamiskā atmiņas piešķiršana C ++ ir ļoti svarīga funkcija, kas ļauj apsvērt savas prasības, lai tiktu galā ar vajadzību pēc reāllaika resursiem. Šajā rakstā mēs izpētīsim Detalizēta izpēte. Šajā rakstā tiks apskatīti šādi rādītāji,

Tāpēc sāksim ar šo rakstu par dinamisko atmiņas piešķiršanu C ++





Vai nepieciešama dinamiskā atmiņas piešķiršana?

Teiksim, mēs vēlamies ievadīt teikumu kā rakstzīmju masīvu, bet mēs neesam pārliecināti par precīzu masīvā nepieciešamo rakstzīmju skaitu.

Deklarējot rakstzīmju masīvu, ja tā lielums būs mazāks par vēlamās virknes lielumu, tiks parādīta kļūda, jo masīvam piešķirtā atmiņas vieta ir mazāka salīdzinājumā ar ievades virknes lielumu. Ja mēs norādīsim tā izmēru, kas ir lielāks par ievades virknes lielumu, masīvam atmiņā tiks piešķirta vieta, kas ir daudz lielāka par vēlamās virknes izmēru, tādējādi nevajadzīgi patērējot vairāk atmiņas, pat ja tā nav nepieciešama.



Iepriekš minētajā gadījumā mums nav idejas par precīzu masīva lielumu līdz apkopošanas laikam (kad dators apkopo kodu un virkni ievada lietotājs). Šādos gadījumos mēs izmantojam jauns operators.

C ++ definē divus vienādus operatorus jauns un dzēst kas izpilda uzdevumu piešķirt un sadalīt atmiņu izpildlaika laikā. Tā kā šie operatori (jaunie un dzēstie) darbojas ar brīvās krātuves atmiņu (kaudzes atmiņu), tos sauc arī par bezmaksas krātuves operatoriem. Rādītāji nodrošina nepieciešamo atbalstu dinamiskai atmiņas sadales sistēmai C ++.

kas ir java labākais idejs

Ar dinamiskās piešķiršanas palīdzību programma var iegūt atmiņu izpildlaika laikā.



Globālie un lokālie mainīgie tiek piešķirti atmiņai sastādīšanas laikā. Tomēr izpildlaika laikā mēs nevaram pievienot nevienu globālu vai lokālu mainīgo. Ja programmai ir jāizmanto mainīgs atmiņas apjoms, mums būs jāpiešķir atmiņa izpildes laikā, kad un kad tas ir nepieciešams. Un, protams, šeit dinamiskās piešķiršanas kārtība var kalpot mērķim.

Atšķirības starp statiskās atmiņas piešķiršanu un dinamiskās atmiņas piešķiršanu:

Šī ir pamata atmiņas arhitektūra, ko izmanto jebkurai C ++ programmai:

Atmiņa - dinamiska atmiņas piešķiršana - Edureka

Mums būs vajadzīgs šāds attēls

Steks tiek izmantots statiskās atmiņas piešķiršanai un Heap - dinamiskās atmiņas piešķiršanai, abi tiek glabāti datora RAM.

Mainīgie, kas tiek piešķirti kaudzē, kamēr statiskās atmiņas sadalījums tiek glabāts tieši atmiņā, un piekļuve šai atmiņai ir ļoti ātra, arī tā piešķiršana tiek risināta, sastādot programmu. Kad funkcija vai metode izsauc citu funkciju, kas savukārt var izsaukt citu funkciju un tā tālāk, visu šo funkciju izpilde tiek apturēta līdz brīdim, kad pati pēdējā funkcija atgriež tās vērtību. Steks vienmēr tiek glabāts LIFO (pēdējais pirmais ārā) secībā, pēdējais rezervētais bloks vienmēr ir nākamais atbrīvojamais bloks. Tas palīdz sekot kaudzei, bloka atbrīvošana no kaudzes ir nekas cits kā viena rādītāja pielāgošana.

Uz kaudzes piešķirtajiem mainīgajiem atmiņa tiek piešķirta darbības laikā, kamēr tiek piešķirta dinamiskā atmiņa. Piekļuve šai atmiņai ir nedaudz lēnāka, salīdzinot ar kaudzīti, taču kaudzes lielumu ierobežo tikai virtuālās atmiņas lielums. Kaudzes elementam nav atkarības viens no otra, un tam vienmēr var piekļūt nejauši jebkurā laika posmā. Mēs varam piešķirt bloku jebkurā laikā un atbrīvot to jebkurā laikā. Tas apgrūtina sekošanu tam, kuras kaudzes daļas tiek piešķirtas vai izvietotas jebkurā brīdī.

Turpinot šo rakstu par dinamisko atmiņas piešķiršanu C ++

Atmiņas piešķiršana, izmantojot jauns Atslēgvārds

C ++ versijā jauns Operators tiek izmantots, lai piešķirtu atmiņu izpildes laikā, un atmiņa tiek piešķirta baitos. The jauns operators apzīmē dinamiskās atmiņas piešķiršanas pieprasījumu kaudzē. Ja ir pieejama pietiekama atmiņa, tad jauns operators inicializē atmiņu un atgriež rādītāja mainīgajam nesen piešķirtās un inicializētās atmiņas adresi.

Sintakse:

datatips * pointer_name = jauns datu tips

Piemērs:

int * ptr = new int // Dinamiskā sadalījuma mainīgo varam deklarēt divos šādos veidos. int * ptr = new int (10) int * ptr = new int {15} // jauns operators tiek izmantots arī, lai piešķirtu datu tipa atmiņas bloku (masīvu). int * ptr = new int [20] // Iepriekš minētais apgalvojums dinamiski piešķir atmiņu 20 veseliem skaitļiem, kas nepārtraukti ir int tipa, un atgriež rādītāju secības pirmajam elementam uz ‘ptr’ rādītāju.

Piezīme : Ja kaudzei nav pietiekami daudz atmiņas, lai to piešķirtu, jaunais pieprasījums norāda uz kļūmi, izmetot izņēmumu std :: bad_alloc, ja vien jaunajam operatoram netiek izmantots “nothrow”, tādā gadījumā tas atgriež NULL rādītāju. Tāpēc ir laba prakse pirms tā izmantošanas programmā pārbaudīt, vai rādītāja mainīgais ir jauns.

Turpinot šo rakstu par dinamisko atmiņas piešķiršanu C ++

Atmiņas izplatīšana, izmantojot dzēst Atslēgvārds:

Kad kaudzes atmiņa ir piešķirta mainīgajam vai klases objektam, izmantojot jauns atslēgvārdu, mēs varam sadalīt šo atmiņas vietu, izmantojot dzēst atslēgvārdu.

Sintakse:

dzēst pointer_variable // Šeit pointer_variable ir rādītājs, kas norāda uz datu objektu, ko izveidojis jauns. dzēst [] pointer_variable // Lai atbrīvotu dinamiski piešķirto masīva atmiņu, ko norāda rādītāja mainīgais, mēs izmantojam šādu dzēšanas veidu:

Piemērs:

dzēst ptr dzēst [] ptr

Piezīme : Objekta apjoms vai objekta kalpošanas laiks ir laiks, par kuru objekts paliek atmiņā programmas izpildes laikā. Kaudzes atmiņas piešķiršana ir lēnāka nekā kaudze, jo kaudzē nav īpašas kārtības, kādā jūs varat piešķirt atmiņu, bet kaudzē tā seko LIFO.

Turpinot šo rakstu par dinamisko atmiņas piešķiršanu C ++

Dinamiski masīvu piešķiršana

Dinamiskās atmiņas piešķiršanas jēdziens galvenokārt tiek izmantots atmiņas piešķiršanai masīvam, kad mums tas jādeklarē, norādot tā lielumu, bet neesam pārliecināti par to.

Apskatīsim piemēru, lai saprastu tā lietošanu.

#include izmantojot nosaukumvietu std int main () {int len, summa = 0 cout<< 'Enter the no. of students in the class' <>len int * markas = jauns int [len] // Dinamiskās atmiņas piešķiršanas cout<< 'Enter the marks of each student' << endl for( int i = 0 i>* (atzīmē + i)} (int i = 0 i

Paskaidrojums:
Šajā piemērā vispirms lietotājam tiek prasīts skolēnu skaits klasē, un tā vērtība tiek saglabāta mainīgajā “len”. Tad mēs pasludinām vesela skaitļa masīvu un piešķiram tam atmiņā vietu dinamiski vienādu ar vērtību, kas saglabāta mainīgajā len, izmantojot šo paziņojumu int * markas = new int [length], tādējādi tam tiek piešķirta vieta, kas vienāda ar 'length * (izmērs 1 vesels skaitlis)'. Pārējais kods ir pats par sevi saprotams.

Turpinot šo rakstu par dinamisko atmiņas piešķiršanu C ++

Dinamiskā atmiņas piešķiršana objektiem

Mēs varam arī dinamiski piešķirt objektus.

Tā kā mēs zinām, ka Constructor īpaša klases dalībnieka funkcija, ko izmanto objekta inicializēšanai, un Destructor ir arī klases locekļa funkcija, kas tiek izsaukta ikreiz, kad objekts iziet no darbības jomas.

Iznīcinātāju var izmantot, lai atbrīvotu objektam piešķirto atmiņu. To sauc šādos apstākļos.

  • Kad vietējais objekts iziet no darbības jomas
  • Globālam objektam, ja operators tiek lietots rādītājam uz klases objektu

Mēs atkal varam izmantot rādītājus, vienlaikus dinamiski piešķirot atmiņu objektiem.

Apskatīsim objektu masīva piemēru.

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

Izeja:

Paskaidrojums:

Konstruktors tiks izsaukts trīs reizes, jo mēs piešķiram atmiņu trim izlases klases objektiem. Katrā no šiem objektiem iznīcinātājs tiks izsaukts arī trīs reizes. ‘Random * a = new Random [3]’ šis paziņojums ir atbildīgs par mūsu objekta dinamisko atmiņas piešķiršanu.

Tādējādi esam nonākuši pie šī raksta par ‘Dinamiskās atmiņas piešķiršanu C ++’ beigām. Ja vēlaties uzzināt vairāk, iepazīstieties ar Autors: uzticams tiešsaistes mācību uzņēmums Edureka. Edureka Java J2EE un SOA apmācības un sertifikācijas kurss ir paredzēts, lai apmācītu jūs gan galvenajiem, gan uzlabotajiem Java jēdzieniem kopā ar dažādiem Java ietvariem, piemēram, Hibernate & Spring.

java konvertēt dubultā uz veselu skaitli

Vai mums ir jautājums? Lūdzu, pieminējiet to šī emuāra komentāru sadaļā, un mēs sazināsimies ar jums pēc iespējas ātrāk.