Únik paměti

Aktuální verze stránky ještě nebyla zkontrolována zkušenými přispěvateli a může se výrazně lišit od verze recenzované 22. prosince 2020; kontroly vyžadují 11 úprav .

Únik paměti je proces  nekontrolovaného snižování množství volné RAM nebo virtuální paměti počítače spojený s chybami při spouštění programů , které včas neuvolňují paměť od nepotřebných dat, nebo s chybami ve službách řízení systémové paměti.

Co je únik paměti

Zvažte následující fragment kódu C++ :

char * ukazatel = NULL ; for ( int i = 0 ; i < 10 ; i ++ ) { ukazatel = nový znak [ 100 ]; } smazat [] ukazatel ;

Tento příklad vytvoří objekt v haldě na 3. řádku. Kód na 3. řádku se provede 10krát a pokaždé, když adresa nového objektu přepíše hodnotu uloženou v ukazateli. Na 5. řádku se odstraní objekt vytvořený při poslední iteraci smyčky. Prvních 9 objektů však zůstává v dynamické paměti a zároveň v programu nezůstaly žádné proměnné, které by adresy těchto objektů uchovávaly. To znamená, že na 5. řádku není možné přistupovat k prvním 9 objektům nebo je smazat.

Jaká jsou nebezpečí úniku paměti

Dynamická paměť je omezený zdroj. Dynamická paměť programu je obvykle spravována knihovnou programovacího jazyka, která sama běží nad dynamickou pamětí poskytovanou operačním systémem.

Úniky paměti vedou k tomu, že spotřeba paměti programu nekontrolovatelně narůstá, v důsledku čehož dříve nebo později vstoupí v platnost architektonická omezení prováděcího prostředí ( operační systém , virtuální stroj , počítač ) a poté dojde k novému přidělení paměť se stává nemožnou. V této situaci se program, který požaduje paměť, obvykle zhroutí . To se může shodou okolností stát úplně jinému programu poté, co program podléhající únikům vyčerpá veškerou paměť počítače.

Způsoby, jak zabránit

Existují různé způsoby, jak zabránit únikům paměti.

Odmítnutí dynamické paměti

Například FORTRAN-77 zcela upouští od používání mechanismů dynamické alokace paměti, které sice takové chyby eliminují, ale výrazně omezují funkčnost programů.

Vlastnit ukazatele

Vlastnictví ukazatelů vám umožňuje nějak se dohodnout na životnosti ukazatele a životnosti objektu, na který odkazuje. Použití vlastnických ukazatelů však nepomůže v případě kruhových odkazů mezi objekty. (podrobnosti viz vzor „ Akvizice zdrojů je inicializace “)

Odvoz odpadu

Některé programovací jazyky (například Oberon , Java , jazyky platformy .NET ) poskytují nástroje pro automatické uvolnění nepoužívané paměti („ garbage collector “, anglicky  garbage collector ). Sběratelé odpadků také řeší problém kruhových odkazů, ale sběr odpadků je operace náročná na zdroje. Náklady na použití takových nástrojů jsou rychlost systému, a co je nejdůležitější, garbage collection zavádí neočekávané pauzy v programu, což je v systémech v reálném čase nepřijatelné .

Sběr odpadu vynalezl John McCarthy kolem roku 1959 při vývoji programovacího jazyka Lisp , jehož struktura extrémně ztěžuje manuální správu paměti.

Restart programu

V případech, kdy není možné eliminovat úniky paměti, například při použití kódu dodávaného jako zásuvné moduly a vytvořeného vývojáři třetích stran, se používá zvláštní způsob ignorování úniků. Uniklý kód je umístěn do samostatného programu a tento program je restartován v požadované frekvenci. Starty a restarty programu jsou prováděny externím programem, který také dodává počáteční data a přebírá výsledky. Protože po ukončení programu je veškerá paměť, kterou si nárokuje z operačního systému, vrácena operačnímu systému, tato metoda zabraňuje tomu, aby se úniky staly katastrofálními.

Únik jiných zdrojů

Existuje také chyba nazvaná Handle Leak : Zachycené úchyty se nevracejí do operačního systému.

V boji s následky takových chyb do nich vývojáři operačních systémů zavádějí funkce, které jim umožňují omezit množství paměti, počet úchytů a množství procesorového času dostupného jednomu uživateli nebo konkrétnímu procesu.

Detekce netěsností

Pro profesionální programovací jazyky existují speciální profilovací programy , které umožňují odhalit mimo jiné i úniky paměti.

Pro některé programovací jazyky existují statické analyzátory kódu , které identifikují prvky programu, které mohou potenciálně vést k logickým chybám, včetně úniků paměti. Primitivní verze takového analyzátoru je implementována téměř jakýmkoli kompilátorem vysokoúrovňového jazyka ve formě vydávání takzvaných varování (varování) - zpráv o přítomnosti konstruktů v programu, které formálně neporušují syntaxi jazyka jazyk, ale jsou potenciálně chybné.

Existují knihovny pro ladění využití paměti , které vám pomohou monitorovat alokaci paměti a dealokaci za běhu programu.

Viz také

Odkazy