Memorie dinamică

Memoria dinamică , de asemenea , heap (Engl. Pentru, morman „“ gramada „), memoria heap sau spațiul heap este o zonă de memorie din care în timpul rulării unui program de poate fi solicitate secțiuni de memorie contigue și lansat în orice ordine. Partajarea se poate face atât manual, cât și cu ajutorul unui colector de gunoi automat . O cerere de memorie din heap este numită și o cerere de memorie dinamică . Este folosit de programe pentru a avea disponibilă memorie tampon suplimentară, în plus față de memoria ocupată de codul programului însuși și de câmpurile de date rezervate permanent și de stivă (memoria stivei) .

Gestionarea dinamică a memoriei înseamnă un efort suplimentar considerabil pentru dezvoltarea aplicațiilor și este o sursă frecventă de erori, în special pentru scurgerile de memorie . O eroare tipică este, de exemplu, că referințele la memoria alocată dinamic sunt suprascrise neintenționat și zona cu referință inițială nu mai poate fi eliberată. În schimb, pot rămâne și referințe la memorie care au fost deja lansate. Astfel de referințe sunt cunoscute sub numele de indicatori agățați .

Diferența față de stivă

Diferă de stivă, deoarece secțiunile de memorie solicitate din stivă trebuie să fie eliberate în ordinea inversă în care au fost solicitate. Aceasta restricționează refolosirea zonelor de stivă care nu mai sunt necesare; în mod similar, o funcție trebuie să renunțe la revendicările sale de memorie stivă înainte de a reveni la funcția de apelare. Stiva este denumită și cerere automată de memorie . Timpul necesar pentru o cerere automată de memorie în timpul rulării este de obicei semnificativ mai mic decât pentru o cerere de memorie dinamică. Deoarece în majoritate doar o mică zonă de memorie este rezervată stivei, o încetare nedorită a programului din cauza unei revărsări a stivei poate apărea în cazul utilizării intensive din cauza cererilor foarte mari sau foarte multe .

Suport pentru cerințele de memorie dinamică în limbaje de programare

Limbajele de programare acceptă cerințele de memorie dinamică în diferite moduri. În ISO- C , de exemplu, există funcțiile malloc () , calloc () și realloc () în acest scop . Memoria este apoi eliberată din nou cu funcția free () .

În ISO- C ++ , pe lângă funcțiile deja preluate de la C, există opțiunea de a solicita dinamic memorie cu ajutorul unei noi sau de a o elibera din nou cu ștergere .

Gestionarea memoriei

În comparație cu stiva, administrarea heap-ului de către mediul de rulare este mai complexă. Zonele de memorie trebuie solicitate de aplicație în orice moment și eliberate din nou în orice ordine. Mărimea zonelor și momentul solicitării sau eliberării sunt imprevizibile.

Următoarele cerințe parțial contradictorii sunt plasate, așadar, asupra gestionării dinamice a memoriei :

  • De mare viteză
  • Utilizarea eficientă a memoriei
  • Mic efort administrativ

Eliberarea ulterioară a unui bloc poate duce la fragmentarea externă . O colectare automată a gunoiului poate reuni zonele de memorie libere astfel încât să fie disponibile blocuri libere mai mari.

Gestionarea dinamică a memoriei poate fi inadecvată pentru aplicații în timp real , deoarece trebuie garantate atât timpul de execuție, cât și alocarea cu succes.

implementare

Diverse structuri de date sunt utilizate pentru a gestiona blocurile gratuite:

Vezi si

Link-uri web