Când are loc o scurgere de memorie?
După ce software-ul alocă memorie, dar nu o eliberează după ce a terminat, există un pierdere de memorie . Aceasta înseamnă că programul continuă să aloce din ce în ce mai multă memorie pentru variabile noi, lăsând memoria veche alocată și nefolosită. Acest lucru duce la utilizarea programului din ce în ce mai multă memorie și, în cele din urmă, programul se blochează din cauza unei erori de memorie lipsită.
Efectele scurgerii de memorie în C
Scurgeri de memorie poate cauza o mulțime de probleme într-un program. Dacă nu este bifată, a pierdere de memorie poate cauza blocarea programului sau oprirea rulării, ceea ce poate duce la pierderea sau coruperea datelor. În plus, deoarece programul consumă mai multă memorie decât are nevoie, poate afecta performanța sistemului și poate încetini alte programe care rulează pe același sistem.
Alocarea memoriei în limbajul C
Alocarea memoriei se realizează utilizând malloc() funcția în limbajul C. Această metodă returnează o referință la un bloc de memorie cu dimensiunea specificată. Valoarea pointerului este utilizată pentru a accesa blocul de memorie alocat. Odată ce memoria nu este necesară, aceasta trebuie eliberată folosind gratuit() funcţie.
Cauzele scurgerilor de memorie
Unele dintre cauzele scurgeri de memorie sunt:
1: Gestionarea necorespunzătoare a memoriei
Cel mai frecvent motiv pentru pierderile de memorie este gestionarea slabă a memoriei din partea programatorului. Acest lucru se întâmplă atunci când un program neglijează să elibereze memoria care nu mai este necesară.
#include
#include
int principal ( )
{
int * ptr = ( int * ) malloc ( dimensiunea ( int ) ) ;
* ptr = 10 ;
printf ( „%d \n ' , * ptr ) ;
ptr = NUL ;
întoarcere 0 ;
}
În codul de mai sus, folosind malloc() metoda în ptr pointer, am alocat spațiu pentru un bloc de memorie întreg. The ptr valoarea pointerului se schimbă atunci când setăm NUL la acesta, totuși blocul de memorie la care se referea anterior nu este eliberat. Prin urmare, a pierdere de memorie va rezulta.
Ieșire
2: Indicator în afara domeniului de aplicare
Când o variabilă pointer își are domeniul de aplicare, a pierdere de memorie apare în programele C.
#include#include
int principal ( )
{
int num1 = 32 , num2 = 23 ;
{
int * sumă = ( int * ) malloc ( dimensiunea ( int ) ) ;
* sumă = num1 + num2 ;
printf ( „%d \n ' , * sumă ) ;
}
printf ( „%d \n ' , * sumă ) ;
întoarcere 0 ;
}
În programul C de mai sus, principal() funcția folosește un domeniu local pentru a aloca un bloc de memorie întreg sumă variabila pointer. Din moment ce am folosit sumă pointer pentru a atribui adăugarea a și b la blocul de memorie nou format, blocul de memorie este alocat continuu chiar și după ce s-a încheiat domeniul de aplicare al blocului. Prin urmare, a pierdere de memorie o să se întâmple.
Ieșire
Detectarea scurgerilor de memorie în C
Detectarea și prevenirea scurgeri de memorie sunt esențiale pentru menținerea stabilității și performanței programului. A detecta scurgeri de memorie , programatorii pot folosi instrumente precum Poarta electorală , un instrument de depanare a memoriei și de profilare. Poarta electorală ajută la identificarea scurgerilor de memorie prin urmărirea tuturor acceselor de memorie într-un program și identificând când memoria alocată nu este eliberată.
Prevenirea scurgerilor de memorie în C
A preveni scurgeri de memorie , urmați instrucțiunile de mai jos.
1: Eliberați întotdeauna memoria alocată
Memoria ar trebui să fie întotdeauna eliberată în mod explicit folosind gratuit() metoda după ce a fost alocată dinamic folosind o funcție ca malloc(), calloc() sau realloc() . Făcând acest lucru, se asigură că memoria este returnată în sistem și este disponibilă pentru alte utilizări.
2: Monitorizarea memoriei alocate
Monitorizarea memoriei alocate este importantă pentru a vă asigura că este eliberată atunci când nu mai este necesară. Acest lucru poate fi realizat prin urmărirea fiecărei memorie care a fost alocată și eliberarea acesteia atunci când nu mai este necesară.
3: Urmăriți indicatorii
Indicatorii ar trebui urmăriți pentru a gestiona automat alocarea și dealocarea memoriei, prevenind scurgerile de memorie.
4: Utilizați instrumente de analiză statică
În timpul construirii, instrumentele de analiză statică pot identifica posibilele scurgeri de memorie în programele C, cum ar fi Clang și GCC. Înainte ca aplicația să fie rulată, aceste instrumente pot ajuta la localizarea posibilelor scurgeri de memorie și la formularea de sugestii de corecție.
Următorul exemplu ilustrează procesul de mai sus.
#include#include
#include
int principal ( )
{
int * ptr = ( int * ) malloc ( dimensiunea ( int ) ) ;
dacă ( ptr == NUL ) {
printf ( „Eroare de alocare a memoriei. \n ' ) ;
întoarcere 1 ;
}
* ptr = 10 ;
printf ( „%d \n ' , * ptr ) ;
gratuit ( ptr ) ;
întoarcere 0 ;
}
Acest cod de mai sus determină mai întâi dacă alocarea memoriei a avut succes verificând pentru a vedea dacă ptr referința nu este NUL . Codul poate gestiona eroarea în mod corespunzător dacă alocarea eșuează. Dacă alocarea a avut succes, codul dă blocului de memorie o valoare de 10 și îl scoate. După aceea, codul eliberează memoria care a fost alocată utilizând codul gratuit() funcţie.
Ieșire
Concluzie
Scurgeri de memorie poate cauza probleme semnificative în programe, inclusiv degradarea performanței și blocări. Astfel de probleme pot fi identificate și prevenite prin gestionarea atentă a memoriei, testarea adecvată și monitorizarea utilizării memoriei. Ca atare, programatorii trebuie să fie conștienți de potențialul de scurgeri de memorie și ar trebui să ia măsurile necesare pentru a le preveni.