Hiba: „A GDB nem fér hozzá a memóriához a címen” a C++ nyelven

Hiba A Gdb Nem Fer Hozza A Memoriahoz A Cimen A C Nyelven



A hibakeresés elengedhetetlen része a folyamatnak, amikor alkalmazásokat fejlesztünk C++ nyelven vagy bármely más programozási nyelven. Alkalmazások létrehozása C++ nyelven nem egyszerű; jó adatszerkezeti készségeket, hibajavítási készségeket és a hibakereső eszközök kezelését foglalja magában. A GDB, a GNU Debugger egy hatékony eszköz, amely segít a fejlesztőknek azonosítani és megoldani a kódjukban lévő hibákat. A GDB egy érdekesen egyszerű és hasznos eszköz, amely segít a fejlesztőknek megtalálni és kijavítani a kódhibákat.

A GDB használata során azonban előfordulhat, hogy „hiba: a GDB nem fér hozzá a memóriához a címen” hibával. Ez a hiba zavaró lehet, és megnehezíti a hibakeresés folytatását. Ez a cikk a hiba előfordulásának okának azonosítására és néhány olyan kódra vonatkozó példával foglalkozik, amelyek segítenek megérteni a hiba elhárítását.

1. példa:

Lássuk az első kódpéldánkat, amely végrehajtáskor „A GDB nem fér hozzá a memóriához a címen” hibát ad. Először nézzük meg a kódot. Ezután látni fogjuk ennek soronkénti magyarázatát.







#include
segítségével névtér std ;
int fő- ( üres ) {
int * p ;
cout << * p ;
}

A program az „#include ” előfeldolgozó direktíva deklarálásával és a „namespace std” használatával kezdődik, amelyek elengedhetetlenek a programba való beépítéshez a szabványos bemeneti és kimeneti funkciók használatához. Ezt követően jön a fő belépési pont, ami az „int main(void);”. Ez a sor deklarálja a program kezdőpontját.



A fő függvényen belül a „*p” mutatóváltozó deklarálva van. Itt a „p” változó nincs inicializálva. Ezért nem mutat semmilyen konkrét memóriahelyre, amely az egész szám számára van fenntartva. Ez a sor hibát okoz, amelyet később megoldunk. A következő sorban megpróbáljuk kinyomtatni a „*p” változó értékét a „cout” utasítás segítségével.



Mivel a „p” változó egy egész típusú mutató, a „*” csillagot használjuk a hivatkozás megszüntetésére. Ez azt jelenti, hogy az érték azon a memóriahelyen van, amelyre mutat. Mivel azonban a „p” mutató nincs inicializálva, és nem mutat semmilyen konkrét és érvényes helyre, a mutató hivatkozásának megszüntetése meghatározatlan viselkedést eredményez. Ezért a rendszertől és a fordítóprogramtól függően különféle típusú hibákat generál. Mivel a GDB fordítót használjuk a program hibakeresésére és futtatására, a hibakereső a következő hibát fogja dobni. A hiba a kimeneti kódrészletben látható:





Amint a kimeneten látható, a hibakereső nem fér hozzá a memóriához. Ez a program egy inicializálatlan mutatóra hivatkozik, ami ennek a meghatározatlan viselkedésnek a fő oka. Most pedig nézzük meg, hogyan oldhatjuk meg ezt a problémát. A helyes kód az alábbiakban található. Vessen egy pillantást rá, és elmagyarázzuk, hogyan javítjuk ki a hibát a kódban:



#include
segítségével névtér std ;
int fő- ( üres ) {
int val = 5 ;
int * p = & val ;
cout << 'Az érték = ' << * p ;

}

Amint láthatja, a kód az „int val =5;” besorolásával módosul. nyilatkozat. Ez a sor deklarál egy „val” nevű egész változót, és inicializálja „5” értékkel. A következő sor, az „int *p = &val;”, deklarál egy „*p” mutatóváltozót, és inicializálva a „val” változó címére mutat. Korábban a „*p” mutató nem mutatott semmilyen memóriacímre, ami miatt a „nem fér hozzá a memóriához a 0x0 címen”.

A probléma megoldásához a „var” változót deklarálják, inicializálják, és hozzárendelik a „*p” mutatóhoz. Most a „*p” mutató a „val” változó címére mutat, mivel az „&” operátor veszi a „val” címét, és hozzárendeli a „p”-hez. Ismét a „cout” utasítást használják a „*p” mutató értékének kinyomtatására. Tekintse meg a következő kimeneti kódrészletet a „*p” mutató által elérhető „val” értékének megtekintéséhez:

Amint láthatja, a hiba megoldódott, és az „5” érték inicializálva lett, mivel a „val” változót a „*p” mutató valribale meghívásával nyomtatták ki.

2. példa:

Tekintsünk egy másik példát, amely elmagyarázza, hogyan kezeljük a „GDB nem fér hozzá a memóriához a címen” hibára a C++ kódprogramban. A kód az alábbiakban található referenciaként. Nézd meg:

#include
int fő- ( ) {
int * p = új int [ tizenöt ] ;
töröl [ ] p ;
std :: cout << p [ 2 ] << std :: endl ;
Visszatérés 0 ;
}

Az egyik leggyakoribb forgatókönyv, amellyel a fejlesztők találkoznak mutatókkal történő programozás közben, a helytelen vagy nem megfelelő memóriafoglalás. A GDB hibát okoz, ha helytelen memóriafoglalás és felszabadítás történik egy C++ programban.

Figyelembe véve az előző kódpéldát, egy „*p” mutató inicializálódik egy új int-vel[15]. Ez az utasítás dinamikusan lefoglal egy 15 egész számból álló tömböt az új operátor használatával. A „*p” mutatóváltozó tárolja a tömb memóriacímét.

A következő utasításban a „delete[] p;” azt állítja, hogy a memória a delete[] paranccsal lett felszabadítva. A delete[] parancs felszabadítja a „*p” mutató korábban lefoglalt memóriáját, ami azt jelenti, hogy a többi rendszer újra lefoglalhatja a korábban lefoglalt memóriablokkot. Amikor megpróbáljuk kinyomtatni a „*p” változó értékét a „cout” utasítással, a memória-hozzáférési hibát kapjuk, amint az a következő kimenetben látható:

Itt érdemes szem előtt tartani, hogy a pontos hibaüzenet kissé eltérhet a GDB verziójától és a rendszerétől függően. De a „hiba: a GDB nem tud hozzáférni a memóriához a helyszínen” és az előző részletben megadott hiba megegyezik. A hiba megoldásához egyszerűen el kell tolni a delete[] parancsot a „cout” utasítás után. Lásd a módosított kódot az alábbiakban:

#include
int fő- ( ) {
int * p = új int [ tizenöt ] ;
számára ( int én = 0 ; én < tizenöt ; ++ én ) {
p [ én ] = én * 2 - 5 + 8 ;
std :: cout << 'p[' << én << '] = ' << p [ én ] << std :: endl ;
}
töröl [ ] p ;
Visszatérés 0 ;
}

Itt látható, hogy a tömböt a futási időben számított értékekkel inicializáltuk, és a ciklus összes értékét a „for” ciklus segítségével nyomtattuk ki. Itt a legfontosabb megjegyezni a delete[] utasítás eltolása; most akkor hívják meg, miután megkapta a memóriaelérési hibát eltávolító tömb összes értékét. Lásd a kód végső kimenetét az alábbiakban:

Következtetés

Összefoglalva, a „hiba: a GDB nem fér hozzá a memóriához a címen” hiba általában a memóriával kapcsolatos problémákat jelzi a C++ kódban. Ez a cikk néhány gyakori forgatókönyvet vizsgált meg, amelyek ezt a hibát okozzák, hogy elmagyarázza, mikor és hogyan lehet megoldani. Ha ez a hiba előfordul a kódban, nagyon fontos, hogy alaposan átnézze azt, különös figyelmet fordítva a mutatóváltozókra, a memóriafoglalásokra, a tömbökre és a struktúrákra.

Ezenkívül a GDB által biztosított szolgáltatások, például a töréspontok segíthetnek megtalálni a hibát a program hibakeresése közben. Ezek a funkciók segíthetnek a memóriával kapcsolatos hibák pontos helyének meghatározásában. E problémák proaktív megoldásával a fejlesztők növelhetik C++ alkalmazásaik stabilitását és megbízhatóságát.