Mikor fordul elő memóriaszivárgás?
Miután a szoftver lefoglalja a memóriát, de nem engedi fel, miután végzett vele, van a memória szivárgás . Ez azt jelenti, hogy a program továbbra is egyre több memóriát foglal le az új változók számára, miközben a régi memóriát lefoglalva és kihasználatlanul hagyja. Ez azt eredményezi, hogy a program egyre több memóriát használ, és végül a program összeomlik egy memóriahiány miatt.
A memóriaszivárgás hatásai C-ben
Memóriaszivárgás sok problémát okozhat egy programban. Ha nincs bejelölve, a memória szivárgás a program összeomlását vagy leállását okozhatja, ami adatvesztéshez vagy sérüléshez vezethet. Ezenkívül, mivel a program több memóriát fogyaszt, mint amennyire szüksége van, hatással lehet a rendszer teljesítményére, és lelassíthatja az ugyanazon a rendszeren futó más programok működését.
Memóriakiosztás C nyelven
A memória lefoglalása a malloc() funkció a C nyelvben. Ez a módszer a megadott méretű memóriablokkra ad vissza hivatkozást. A mutató értéke a lefoglalt memóriablokk elérésére szolgál. Ha már nincs szükség a memóriára, fel kell szabadítani a segítségével ingyenes() funkció.
Memóriaszivárgások okai
Néhány oka a memóriaszivárgás vannak:
1: Nem megfelelő memóriakezelés
A memóriaszivárgások leggyakoribb oka a programozó rossz memóriakezelése. Ez akkor fordul elő, ha egy program elhanyagolja a már nem szükséges memória felszabadítását.
#include
#include
int fő- ( )
{
int * ptr = ( int * ) malloc ( mérete ( int ) ) ;
* ptr = 10 ;
printf ( '%d \n ' , * ptr ) ;
ptr = NULLA ;
Visszatérés 0 ;
}
A fenti kódban a malloc() módszer a ptr mutatót, helyet foglaltunk egy egész memóriablokk számára. A ptr a mutató értéke megváltozik, amikor beállítjuk NULLA hozzá, mégsem szabadul fel az a memóriablokk, amelyre korábban hivatkozott. Ezért a memória szivárgás eredménye lesz.
Kimenet
2: Hatáskörön kívüli mutató
Ha egy mutatóváltozó létezik, a hatóköre, a memória szivárgás C programokban fordul elő.
#include#include
int fő- ( )
{
int szám1 = 32 , num2 = 23 ;
{
int * összeg = ( int * ) malloc ( mérete ( int ) ) ;
* összeg = szám1 + szám2 ;
printf ( '%d \n ' , * összeg ) ;
}
printf ( '%d \n ' , * összeg ) ;
Visszatérés 0 ;
}
A fenti C programban a fő() függvény helyi hatókört használ egy egész memóriablokk lefoglalásához a összeg mutató változó. Mivel mi használtuk a összeg mutató az a és b hozzáadásának hozzárendeléséhez az újonnan kialakított memóriablokkhoz, a memóriablokk a blokk hatókörének lejárta után is folyamatosan kiosztásra kerül. Ezért a memória szivárgás fog bekövetkezni.
Kimenet
Memóriaszivárgások észlelése C-ben
Felismerése és megelőzése memóriaszivárgás kritikus fontosságúak a program stabilitásának és teljesítményének fenntartásához. Észlelni memóriaszivárgás , a programozók olyan eszközöket használhatnak, mint Választási kapu , memória hibakereső és profilozó eszköz. Választási kapu segít azonosítani a memóriaszivárgást azáltal, hogy nyomon követi az összes memória-hozzáférést a programban, és azonosítja, ha a lefoglalt memória nem szabadul fel.
Memóriaszivárgások megelőzése C-ben
Megelőzni memóriaszivárgás , kövesse az alábbi utasításokat.
1: Mindig engedje fel a lefoglalt memóriát
A memóriát mindig kifejezetten fel kell szabadítani a ingyenes() metódust, miután dinamikusan kiosztották egy hasonló függvény segítségével malloc(), calloc() vagy realloc() . Ezzel megbizonyosodik arról, hogy a memória visszakerül a rendszerbe, és más célokra elérhető.
2: Lefoglalt memória figyelése
A lefoglalt memória figyelése azért fontos, hogy megbizonyosodjon arról, hogy akkor szabadul fel, amikor már nincs rá szükség. Ez úgy érhető el, hogy nyomon követi az összes lefoglalt memóriát, és felszabadítja, amikor már nincs rá szükség.
3: Kövesse nyomon a mutatókat
A mutatókat nyomon kell követni, hogy automatikusan kezelje a memóriafoglalást és -felszabadítást, megelőzve a memóriaszivárgást.
4: Használja a statikus elemző eszközöket
Az összeállítás során a statikus elemző eszközök azonosítani tudják a lehetséges lehetőségeket memóriaszivárgás C-programokban, mint például a Clang és a GCC. Az alkalmazás futtatása előtt ezek az eszközök segíthetnek megtalálni a lehetséges memóriaszivárgást és javítási javaslatokat tenni.
A következő példa a fenti folyamatot szemlélteti.
#include#include
#include
int fő- ( )
{
int * ptr = ( int * ) malloc ( mérete ( int ) ) ;
ha ( ptr == NULLA ) {
printf ( 'Memóriakiosztási hiba. \n ' ) ;
Visszatérés 1 ;
}
* ptr = 10 ;
printf ( '%d \n ' , * ptr ) ;
ingyenes ( ptr ) ;
Visszatérés 0 ;
}
Ez a fenti kód először meghatározza, hogy a memóriafoglalás sikeres volt-e azáltal, hogy ellenőrzi, hogy a ptr hivatkozás nem NULLA . A kód megfelelően kezelheti a hibát, ha az elosztás sikertelen. Ha az allokáció sikeres volt, a kód értéket ad a memóriablokknak 10 és kiadja azt. Ezt követően a kód felszabadítja azt a memóriát, amelyet a ingyenes() funkció.
Kimenet
Következtetés
Memóriaszivárgás jelentős problémákat okozhat a programokban, beleértve a teljesítmény romlását és összeomlásokat. Az ilyen problémák gondos memóriakezeléssel, megfelelő teszteléssel és a memóriahasználat figyelésével azonosíthatók és megelőzhetők. Mint ilyen, a programozóknak tisztában kell lenniük a memóriaszivárgás lehetőségével, és meg kell tenniük a szükséges lépéseket ezek megelőzésére.