Napaka: »GDB ne more dostopati do pomnilnika na naslovu« v C++

Napaka Gdb Ne More Dostopati Do Pomnilnika Na Naslovu V C



Odpravljanje napak je bistveni del procesa pri razvoju aplikacij v C++ ali katerem koli drugem programskem jeziku. Ustvarjanje aplikacij v C++ ni enostavno; vključuje dobre sposobnosti strukture podatkov, veščine odpravljanja napak in upravljanje orodij za odpravljanje napak. GDB, GNU Debugger, je učinkovito orodje, ki razvijalcem pomaga prepoznati in odpraviti napake v njihovi kodi. GDB je zanimivo preprosto in uporabno orodje, ki razvijalcem pomaga najti in odpraviti napake v kodi.

Vendar pa lahko med uporabo GDB naletite na napako »napaka: GDB ne more dostopati do pomnilnika na naslovu«. Ta napaka je lahko zmedena in oteži nadaljevanje odpravljanja napak. Ta članek je osredotočen na odkrivanje, zakaj pride do te napake, in ogled nekaterih primerov kode, ki nam pomagajo razumeti, kako odpraviti to napako.

Primer 1:

Oglejmo si naš prvi primer kode, ki po izvedbi prikaže napako »GDB ne more dostopati do pomnilnika na naslovu«. Najprej pogledamo kodo. Nato bomo videli razlago vrstice za vrstico.







#include
uporabo imenski prostor std ;
int glavni ( praznina ) {
int * str ;
cout << * str ;
}

Program se začne z deklaracijo predprocesorske direktive “#include ” in uporabo “imespace std”, ki je bistvenega pomena za vključitev v program za uporabo standardnih vhodnih in izhodnih funkcij. Po tem pride glavna vstopna točka, ki je 'int main(void);'. Ta vrstica navaja začetno točko programa.



Znotraj glavne funkcije je deklarirana spremenljivka kazalca »*p«. Tukaj spremenljivka 'p' ni inicializirana. Zato ne kaže na nobeno specifično pomnilniško lokacijo, ki je rezervirana za celo število. Ta vrstica povzroči napako, ki jo bomo odpravili pozneje. V naslednji vrstici poskušamo natisniti vrednost spremenljivke “*p” z uporabo stavka “cout”.



Ker je spremenljivka »p« kazalec tipa integer, se za dereferenciranje uporablja zvezdica »*«. To pomeni, da je vrednost na pomnilniški lokaciji, na katero kaže. Ker pa kazalec »p« ni bil inicializiran in ne kaže na nobeno specifično in veljavno lokacijo, bo dereferenciranje kazalca povzročilo nedefinirano vedenje. Posledica tega je generiranje različnih vrst napak, odvisno od sistema in prevajalnika. Ker uporabljamo prevajalnik GDB za odpravljanje napak in zagon tega programa, bo razhroščevalnik izdal naslednjo napako. Napaka je prikazana v izhodnem delčku:





Kot lahko vidite v izhodu, razhroščevalnik ne more dostopati do pomnilnika. Ta program dereferencira neinicializiran kazalec, kar je glavni razlog za to nedefinirano vedenje. Zdaj pa poglejmo, kako lahko rešimo ta problem. Pravilna koda je podana v nadaljevanju. Oglejte si ga in razložili vam bomo, kako odpravimo napako v kodi:



#include
uporabo imenski prostor std ;
int glavni ( praznina ) {
int val = 5 ;
int * str = & val ;
cout << 'Vrednost je = ' << * str ;

}

Kot lahko vidite, je koda spremenjena z vključitvijo 'int val =5;' izjava. Ta vrstica deklarira celoštevilsko spremenljivko z imenom 'val' in jo inicializira z vrednostjo '5'. Naslednja vrstica, »int *p = &val;«, deklarira spremenljivko kazalca »*p« in je inicializirana tako, da kaže na naslov spremenljivke »val«. Prej kazalec »*p« ni kazal na noben pomnilniški naslov, kar je povzročilo »ni mogoče dostopati do pomnilnika na naslovu 0x0«.

Za rešitev te težave je spremenljivka »var« deklarirana, inicializirana in dodeljena kazalcu »*p«. Zdaj kazalec »*p« kaže na naslov spremenljivke »val«, saj operater »&« prevzame naslov »val« in ga dodeli »p«. Spet se za izpis vrednosti kazalca »*p« uporablja stavek »cout«. Če si želite ogledati vrednost »val«, do katere dostopa kazalec »*p«, glejte naslednji izhodni delček:

Kot lahko opazite, je bila napaka odpravljena in vrednost »5« je inicializirana, ker je bila spremenljivka »val« natisnjena s klicanjem kazalca »*p« valribale.

Primer 2:

Oglejmo si še en primer, ki pojasnjuje, kako poskrbeti za napako »GDB ne more dostopati do pomnilnika na naslovu« v kodnem programu C++. Koda je navedena spodaj za vašo referenco. Poglej:

#include
int glavni ( ) {
int * str = novo int [ petnajst ] ;
izbrisati [ ] str ;
std :: cout << str [ 2 ] << std :: konec ;
vrnitev 0 ;
}

Eden najpogostejših scenarijev, s katerimi se razvijalci srečujejo pri programiranju s kazalci, je nepravilna ali neustrezna dodelitev pomnilnika. GDB povzroči napako vsakič, ko pride do nepravilne dodelitve in sprostitve pomnilnika v programu C++.

Glede na prejšnji primer kode je kazalec »*p« inicializiran z novim int[15]. Ta stavek dinamično dodeli niz 15 celih števil z uporabo operatorja new. Spremenljivka kazalca “*p” shrani pomnilniški naslov polja.

V naslednjem stavku »delete[] p;« navaja, da je bil pomnilnik sproščen z ukazom delete[]. Ukaz delete[] sprosti predhodno dodeljeni pomnilnik kazalca »*p«, kar pomeni, da lahko drugi uporabniki sistema znova dodelijo predhodno dodeljeni pomnilniški blok. Ko poskušamo natisniti vrednost spremenljivke »*p« z uporabo izjave »cout«, bomo dobili napako pri dostopu do pomnilnika, kot je prikazano v naslednjem izhodu:

Tukaj morate upoštevati, da se lahko točno sporočilo o napaki nekoliko razlikuje glede na vašo različico GDB in sistem. Toda »napaka: GDB ne more dostopati do pomnilnika na lokaciji« in podana napaka v prejšnjem delčku sta enaki. Da bi odpravili to napako, preprosto premaknemo ukaz delete[] za stavkom 'cout'. Oglejte si spremenjeno kodo v naslednjem:

#include
int glavni ( ) {
int * str = novo int [ petnajst ] ;
za ( int jaz = 0 ; jaz < petnajst ; ++ jaz ) {
str [ jaz ] = jaz * 2 - 5 + 8 ;
std :: cout << 'p[' << jaz << '] = ' << str [ jaz ] << std :: konec ;
}
izbrisati [ ] str ;
vrnitev 0 ;
}

Tukaj lahko vidite, da smo matriko inicializirali z vrednostmi, ki so izračunane v času izvajanja, in natisnemo vse vrednosti zanke z uporabo zanke »za«. Najpomembnejša stvar, ki jo je treba upoštevati, je premik stavka delete[]; zdaj se kliče po pridobitvi vseh vrednosti matrike, ki je odstranila napako pri dostopu do pomnilnika. Oglejte si končni rezultat kode v naslednjem:

Zaključek

Skratka, napaka »napaka: GDB ne more dostopati do pomnilnika na naslovu« običajno kaže na težave, povezane s pomnilnikom v kodi C++. Ta članek je raziskal nekaj pogostih scenarijev, ki sprožijo to napako, da bi pojasnil, kdaj in kako jo je mogoče odpraviti. Ko pride do te napake v kodi, jo morate skrbno pregledati, tako da ste pozorni na spremenljivke kazalca, dodelitve pomnilnika, polja in strukture.

Poleg tega lahko funkcije, kot so prekinitvene točke, ki jih ponuja GDB, pomagajo pri odkrivanju napake med odpravljanjem napak v programu. Te funkcije lahko pomagajo pri določanju natančne lokacije napak, povezanih s pomnilnikom. S proaktivnim obravnavanjem teh težav lahko razvijalci izboljšajo stabilnost in zanesljivost svojih aplikacij C++.