C pentru începători

C ++ pentru începători

2.2. Alocarea dinamică a memoriei și indicatorii

Înainte de a ajunge în dezvoltarea orientată pe obiecte, va trebui să facem o mică digresiune despre lucrul cu memoria într-un program C ++. Nu putem scrie niciun program complex, neștiind cum să alocăm memoria în timpul rulării și să-l accesăm.






În C ++, obiectele pot fi plasate fie static - la timpul de compilare, fie dinamic - în timpul executării programului, apelând funcții din biblioteca standard. Principala diferență în utilizarea acestor metode este eficiența și flexibilitatea acestora. Plasarea statică este mai eficientă, deoarece alocarea memoriei are loc înainte de executarea programului, dar este mult mai puțin flexibilă, deoarece trebuie să știm în avans tipul și dimensiunea obiectului plasat. De exemplu, nu este deloc ușor să puneți conținutul unui fișier text într-un șir de șiruri statice: trebuie să cunoaștem dimensiunea acestuia în avans. Sarcini în care este necesar să se stocheze și să se proceseze un număr de elemente necunoscute anterior necesită de obicei alocarea dinamică a memoriei.
Până în prezent, toate exemplele noastre au utilizat alocarea de memorie statică. Spuneți, definiția variabilei ival

Această expresie produce exact aceleași acțiuni ca și

În acest exemplu, nu există nici un sens: utilizarea pointerului pentru a manipula indirect variabila ival este mai puțin eficientă și mai puțin evidentă. Am dat acest exemplu doar pentru a da prima idee de pointeri. În realitate, pointerii sunt folosiți cel mai adesea pentru a manipula obiecte plasate dinamic.
Principalele diferențe dintre alocarea statică și cea dinamică a memoriei sunt:

  • obiectele statice sunt notate cu variabile numite, iar acțiunile asupra acestor obiecte sunt efectuate direct, folosind numele lor. Obiectele dinamice nu au propriile lor nume, iar acțiunile asupra lor sunt realizate indirect, folosind indicii;
  • compilația alocă automat și șterge memoria pentru obiectele statice. Programatorul nu are nevoie să aibă grijă de el însuși. Alocarea și eliberarea memoriei pentru obiectele dinamice este în întregime responsabilitatea programatorului. Aceasta este o sarcină destul de dificilă, atunci când rezolvăm ceea ce este ușor să faci greșeli. Pentru a manipula memoria alocată dinamic, se utilizează operatorii noi și operatorii de ștergere.






Noul operator are două forme. Prima formă alocă memoria pentru un singur obiect de un anumit tip:

În acest exemplu, memoria este alocată unei matrice de patru elemente int. Din păcate, această formă a noului operator nu vă permite să inițializați elementele matricei.
Unele confuzii sunt cauzate de faptul că ambele forme de operatori noi returnează același pointer, în exemplul nostru este un pointer la un număr întreg. Atât pintul, cât și piaul sunt declarate exact la fel, dar pintul indică un singur obiect de tip int, iar pia se referă la primul element dintr-o serie de patru obiecte de tip int.
Atunci când un obiect dinamic nu mai este necesar, trebuie să eliberăm în mod explicit memoria alocată acestuia. Acest lucru se face folosind operatorul de ștergere, care are, ca și cele noi, două formulare - pentru un singur obiect și pentru o matrice:

Ce se întâmplă dacă uităm să eliberăm memoria alocată? Memoria va fi irosită, nu va fi folosită, dar nu poate fi returnată sistemului deoarece nu avem un indicator pentru ea. Acest fenomen a primit o scurgere de memorie specială. În cele din urmă, programul se va prăbuși din cauza lipsei de memorie (dacă, bineînțeles, va funcționa destul de mult). O scurgere mică este dificil de detectat, dar există utilități care ajută la acest lucru.
Revizuirea noastră scurtă a alocării dinamice a memoriei și a utilizării indicatorilor a generat probabil mai multe întrebări decât au dat răspunsuri. În secțiunea 8.4, problemele ridicate vor fi acoperite în detaliu. Cu toate acestea, nu am putut face fără această retragere, deoarece clasa Array, pe care o vom proiecta în secțiunile următoare, se bazează pe utilizarea memoriei alocate dinamic.

Exercitarea 2.3.

Explicați diferența dintre cele patru obiecte:

Exercitarea 2.4.

Ce face următorul fragment de cod? Care este eroarea logică? (Rețineți că operația de luare a unui indice ([]) este aplicată corect pe pointerul pie, o explicație a acestui fapt poate fi găsită în secțiunea 3.9.2.)







Articole similare

Trimiteți-le prietenilor: