A memóriaszivárgás a számítógép szabad RAM - jának vagy virtuális memóriájának kontrollálatlan csökkentésének folyamata, amely a futó programok hibáihoz kapcsolódik , amelyek nem szabadítják fel időben a memóriát a szükségtelen adatoktól, vagy a rendszermemória-vezérlő szolgáltatások hibáival.
Tekintsük a következő C++ kódrészletet :
char * mutató = NULL ; for ( int i = 0 ; i < 10 ; i ++ ) { pointer = új karakter [ 100 ]; } törölje [] mutatót ;Ez a példa egy objektumot hoz létre halomban a 3. sorban. A 3. sorban lévő kód 10-szer kerül végrehajtásra, és minden alkalommal, amikor az új objektum címe felülírja a mutatóban tárolt értéket. Az 5. sorban a ciklus utolsó iterációjában létrehozott objektum törlődik. Az első 9 objektum azonban a dinamikus memóriában marad, ugyanakkor nem marad a programban olyan változó, amely ezen objektumok címét tárolná. Vagyis az 5. sorban nem lehet elérni vagy törölni az első 9 objektumot.
A dinamikus memória korlátozott erőforrás. A programok dinamikus memóriáját általában egy programozási nyelvi könyvtár kezeli, amely maga is az operációs rendszer által biztosított dinamikus memórián fut.
A memóriaszivárgások oda vezetnek, hogy a program memóriafelhasználása ellenőrizhetetlenül növekszik, ennek következtében előbb-utóbb életbe lépnek a végrehajtási környezet ( operációs rendszer , virtuális gép , számítógép ) architekturális korlátai, majd a program új allokációja. a memória lehetetlenné válik. Ebben a helyzetben a memóriát kérő program általában összeomlik . Ez véletlenül megtörténhet egy teljesen más programmal, miután a program kiszivárogtatva kimeríti a számítógép teljes memóriáját.
A memóriaszivárgás megelőzésére többféle módszer létezik.
Például a FORTRAN-77 teljesen felhagy a dinamikus memóriakiosztási mechanizmusok használatával, ami kiküszöböli az ilyen hibákat, de jelentősen korlátozza a programok funkcionalitását.
A mutatók birtoklása lehetővé teszi, hogy valamilyen módon megegyezzen a mutató élettartamában és annak az objektumnak az élettartamában, amelyre hivatkozik. A tulajdonosi mutatók használata azonban nem segít az objektumok közötti körkörös hivatkozások esetén. (a részletekért lásd az „ Erőforrásszerzés inicializálás ” mintát)
Egyes programozási nyelvek (például Oberon , Java , .NET platformnyelvek ) eszközöket biztosítanak a fel nem használt memória automatikus felszabadítására (" szemétgyűjtő ", angol szemétgyűjtő ). A szemétszedők megoldják a körkörös utalások problémáját is, de a szemétszállítás erőforrásigényes tevékenység. Az ilyen eszközök használatának költsége a rendszer sebessége, és ami a legfontosabb, a szemétgyűjtés váratlan szüneteket okoz a programban, ami elfogadhatatlan a valós idejű rendszerekben .
A szemétgyűjtést John McCarthy találta fel 1959 körül, miközben kifejlesztette a Lisp programozási nyelvet , amelynek szerkezete rendkívül megnehezíti a kézi memóriakezelést.
Azokban az esetekben, amikor nem lehet kiküszöbölni a memóriaszivárgást, például plug-inként szállított és külső fejlesztők által készített kód használatakor, a szivárgások figyelmen kívül hagyásának sajátos módját alkalmazzák. A kiszivárgott kód egy külön programba kerül, és ez a program a kívánt gyakorisággal újraindul. A program indítását és újraindítását egy külső program végzi, amely a kiindulási adatokat is szolgáltatja és az eredményeket is átveszi. Mivel egy program leállításakor az operációs rendszertől igényelt összes memória visszakerül az operációs rendszerbe, ez a módszer megakadályozza, hogy a szivárgások katasztrofálissá váljanak.
Van egy Handle Leak nevű hiba is : a rögzített fogantyúk nem kerülnek vissza az operációs rendszerbe.
Az ilyen hibák következményeinek leküzdése érdekében az operációs rendszer fejlesztői olyan funkcionalitást vezetnek be bennük, amely lehetővé teszi számukra a memória mennyiségének, a fogantyúk számának és az egy felhasználó vagy egy adott folyamat számára elérhető processzoridő korlátozását.
A professzionális programozási nyelvekhez léteznek speciális profilkészítő programok , amelyek lehetővé teszik többek között a memóriaszivárgások észlelését.
Egyes programozási nyelvekhez léteznek statikus kódelemzők , amelyek azonosítják azokat a programelemeket, amelyek potenciálisan logikai hibákhoz vezethetnek, beleértve a memóriaszivárgást is. Egy ilyen elemző primitív változatát szinte bármely magas szintű nyelv fordítója megvalósítja úgynevezett figyelmeztetések (figyelmeztetések) formájában - olyan üzenetek formájában, amelyek olyan konstrukciók jelenlétéről szólnak a programban, amelyek formálisan nem sértik meg a szintaxist. a nyelvet, de potenciálisan hibásak.
Vannak olyan könyvtárak a memóriahasználat hibakeresésére , amelyek segítségével a program futása közben figyelemmel kísérheti a memóriafoglalást és -felszabadítást.