En hukommelseslækage er en proces med ukontrolleret reduktion i mængden af ledig RAM eller virtuel hukommelse på en computer forbundet med fejl i kørende programmer , der ikke frigiver hukommelse fra unødvendige data i tide, eller med fejl i systemhukommelseskontroltjenester.
Overvej følgende C++ kodestykke :
char * pointer = NULL ; for ( int i = 0 ; i < 10 ; i ++ ) { pointer = ny char [ 100 ]; } slette [] pointer ;Dette eksempel opretter et objekt i heap på 3. linje. Koden på 3. linje udføres 10 gange, og hver gang overskriver adressen på det nye objekt værdien gemt i markøren. På 5. linje slettes objektet, der blev oprettet ved sidste iteration af løkken. De første 9 objekter forbliver dog i dynamisk hukommelse, og samtidig er der ingen variable tilbage i programmet, som ville gemme adresserne på disse objekter. Det vil sige, i 5. linje er det umuligt at få adgang til eller slette de første 9 objekter.
Dynamisk hukommelse er en begrænset ressource. Et programs dynamiske hukommelse administreres normalt af et programmeringssprogsbibliotek, der selv kører oven på den dynamiske hukommelse, som operativsystemet leverer.
Hukommelseslækager fører til, at programmets hukommelsesforbrug stiger ukontrolleret, som et resultat, før eller siden, træder de arkitektoniske begrænsninger af eksekveringsmiljøet ( operativsystem , virtuel maskine , computer ) i kraft, og derefter en ny allokering af hukommelsen bliver umulig. I denne situation går et program, der anmoder om hukommelse, normalt ned . Dette kan ved en tilfældighed ske med et helt andet program, efter at programmet, med forbehold for lækager, opbruger al computerens hukommelse.
Der er forskellige måder at forhindre hukommelseslækager på.
For eksempel opgiver FORTRAN-77 fuldstændigt brugen af dynamiske hukommelsesallokeringsmekanismer, som eliminerer sådanne fejl, men begrænser programmernes funktionalitet betydeligt.
At eje pointere giver dig mulighed for på en eller anden måde at blive enige om pointerens levetid og levetiden for det objekt, den refererer til. Det hjælper dog ikke at bruge pointers i tilfælde af cirkulære referencer mellem objekter. (for detaljer, se mønsteret " Ressourceanskaffelse er initialisering ")
Nogle programmeringssprog (for eksempel Oberon , Java , .NET platformsprog ) giver værktøjer til automatisk at frigøre ubrugt hukommelse (" garbage collector ", engelsk garbage collector ). Skraldesamlere løser også problemet med cirkulære referencer, men affaldsindsamling er en ressourcekrævende operation. Omkostningerne ved at bruge sådanne værktøjer er systemhastighed, og vigtigst af alt introducerer affaldsindsamling uventede pauser i programmet, hvilket er uacceptabelt i realtidssystemer .
Garbage collection blev opfundet af John McCarthy omkring 1959 , mens han udviklede Lisp -programmeringssproget , hvis struktur gør manuel hukommelseshåndtering ekstremt vanskelig.
I tilfælde, hvor det ikke er muligt at eliminere hukommelseslækager, for eksempel ved brug af kode leveret som plug-ins og lavet af tredjepartsudviklere, bruges en ejendommelig måde at ignorere lækager på. Den lækkede kode placeres i et separat program, og dette program genstartes med den nødvendige frekvens. Start og genstart af programmet udføres af et eksternt program, som også leverer de indledende data og tager resultaterne. Fordi når et program afsluttes, returneres al den hukommelse, det hævder fra operativsystemet, til operativsystemet, denne metode forhindrer lækager i at blive katastrofale.
Der er også en fejl kaldet Handle Leak : Fangede håndtag returneres ikke til operativsystemet.
For at bekæmpe konsekvenserne af sådanne fejl introducerer udviklere af operativsystemer funktionalitet i dem, der giver dem mulighed for at begrænse mængden af hukommelse, antallet af håndtag og mængden af processortid, der er tilgængelig for en bruger eller en bestemt proces.
Til professionelle programmeringssprog findes der specielle profileringsprogrammer, som giver dig mulighed for at opdage blandt andet hukommelseslækager.
For nogle programmeringssprog er der statiske kodeanalysatorer , der identificerer programelementer, der potentielt kan føre til logiske fejl, herunder hukommelseslækager. En primitiv version af en sådan analysator implementeres af næsten enhver kompilator af et højt niveau sprog i form af at udstede såkaldte advarsler (advarsler) - beskeder om tilstedeværelsen i programmet af konstruktioner, der ikke formelt overtræder syntaksen for sproget, men er potentielt fejlagtige.
Der er biblioteker til fejlfinding af hukommelsesbrug, som hjælper dig med at overvåge hukommelsesallokering og -deallokering, mens programmet kører.