Eroare: „GDB nu poate accesa memoria la adresă” în C++

Eroare Gdb Nu Poate Accesa Memoria La Adresa In C



Depanarea este o parte esențială a procesului atunci când se dezvoltă aplicații în C++ sau orice alt limbaj de programare. Crearea de aplicații în C++ nu este ușoară; implică abilități bune de structură a datelor, abilități de remediere a erorilor și gestionarea instrumentelor de depanare. GDB, GNU Debugger, este un instrument eficient care ajută dezvoltatorii să identifice și să rezolve erorile din codul lor. GDB este un instrument interesant de simplu și util care îi ajută pe dezvoltatori să găsească și să repare erorile de cod.

Cu toate acestea, în timp ce utilizați GDB, este posibil să întâlniți eroarea „eroare: GDB nu poate accesa memoria la adresa”. Această eroare poate fi confuză și îngreunează continuarea remedierii. Acest articol se concentrează pe identificarea de ce apare această eroare și pe analizarea unor exemple de cod care ne ajută să înțelegem cum să rezolvăm această eroare.

Exemplul 1:

Să vedem primul nostru exemplu de cod care, la execuție, dă o eroare „GDB nu poate accesa memoria la adresa”. În primul rând, ne uităm la cod. Apoi, vom vedea explicația rând cu linie a acesteia.







#include
folosind spatiu de nume std ;
int principal ( gol ) {
int * p ;
cout << * p ;
}

Programul începe cu declararea directivei de preprocesor „#include ” și ​​folosind „namespace std” care sunt esențiale pentru a fi incluse în program pentru a utiliza funcțiile standard de intrare și ieșire. După aceea, vine punctul de intrare principal care este „int main(void);”. Această linie declară punctul de pornire al programului.



În cadrul funcției principale, este declarată variabila pointer „*p”. Aici, variabila „p” nu este inițializată. Prin urmare, nu indică nicio locație de memorie specifică care este rezervată pentru întreg. Această linie provoacă o eroare pe care o vom rezolva mai târziu. În rândul următor, încercăm să tipărim valoarea variabilei „*p” folosind instrucțiunea „cout”.



Deoarece variabila „p” este un pointer de tipul întreg, asteriscul „*” este folosit pentru a o anula. Aceasta înseamnă că valoarea se află în locația de memorie către care indică. Cu toate acestea, deoarece pointerul „p” nu a fost inițializat și nu indică către nicio locație specifică și validă, dereferențiarea indicatorului va avea ca rezultat un comportament nedefinit. Prin urmare, are ca rezultat generarea de diferite tipuri de erori în funcție de sistem și compilator. Deoarece folosim compilatorul GDB pentru a depana și a rula acest program, depanatorul va arunca următoarea eroare. Eroarea este afișată în fragmentul de ieșire:





După cum puteți vedea în rezultat, depanatorul nu poate accesa memoria. Acest program dereferențează un pointer neinițializat, motivul principal al acestui comportament nedefinit. Acum, să vedem cum putem rezolva această problemă. Codul corect este dat în cele ce urmează. Aruncați o privire și vă vom explica cum remediam eroarea din cod:



#include
folosind spatiu de nume std ;
int principal ( gol ) {
int val = 5 ;
int * p = & val ;
cout << 'Valoarea este = ' << * p ;

}

După cum puteți vedea, codul este modificat prin includerea „int val =5;” afirmație. Această linie declară o variabilă întreagă numită „val” și o inițializează cu o valoare de „5”. Următoarea linie, „int *p = &val;”, declară o variabilă indicator „*p” și este inițializată pentru a indica adresa variabilei „val”. Anterior, indicatorul „*p” nu indica nicio adresă de memorie, ceea ce a cauzat „nu se poate accesa memoria la adresa 0x0”.

Pentru a rezolva această problemă, variabila „var” este declarată, inițializată și atribuită pointerului „*p”. Acum, indicatorul „*p” indică adresa variabilei „val”, deoarece operatorul „&” ia adresa lui „val” și o atribuie lui „p”. Din nou, instrucțiunea „cout” este folosită pentru a tipări valoarea indicatorului „*p”. Consultați următorul fragment de ieșire pentru a vedea valoarea „val” care este accesată de pointerul „*p”:

După cum puteți observa, eroarea a fost rezolvată și valoarea „5” este inițializată deoarece variabila „val” a fost tipărită prin apelarea pointerului „*p” valribale.

Exemplul 2:

Să luăm în considerare un alt exemplu care explică cum să răspundem la eroarea „GDB nu poate accesa memoria la adresa” din programul de cod C++. Codul este dat în cele ce urmează pentru referință. Uită-te:

#include
int principal ( ) {
int * p = nou int [ cincisprezece ] ;
șterge [ ] p ;
std :: cout << p [ 2 ] << std :: endl ;
întoarcere 0 ;
}

Unul dintre cele mai comune scenarii pe care le întâlnesc dezvoltatorii în timpul programării cu pointeri este alocarea incorectă sau necorespunzătoare a memoriei. GDB are ca rezultat eroarea ori de câte ori apar o alocare și o dezalocare incorectă a memoriei într-un program C++.

Luând în considerare exemplul de cod anterior, un pointer „*p” este inițializat cu un nou int[15]. Această declarație alocă dinamic o matrice de 15 numere întregi folosind operatorul nou. Variabila pointer „*p” stochează adresa de memorie a matricei.

În următoarea declarație, „șterge[] p;,” afirmă că memoria a fost dealocată folosind comanda delete[]. Comanda delete[] dezaocă memoria alocată anterior a pointerului „*p”, ceea ce înseamnă că celelalte utilizări ale sistemului pot aloca din nou blocul de memorie alocat anterior. Când încercăm să tipărim valoarea variabilei „*p” folosind instrucțiunea „cout”, vom obține eroarea de acces la memorie așa cum se vede în următoarea ieșire:

Lucrurile de reținut aici sunt că mesajul de eroare exact poate diferi ușor în funcție de versiunea și sistemul dvs. GDB. Dar „eroare: GDB nu poate accesa memoria la locație” și eroarea dată în fragmentul anterior sunt aceleași. Pentru a rezolva această eroare, pur și simplu schimbăm comanda delete[] după declarația „cout”. Vedeți codul modificat în următoarele:

#include
int principal ( ) {
int * p = nou int [ cincisprezece ] ;
pentru ( int i = 0 ; i < cincisprezece ; ++ i ) {
p [ i ] = i * 2 - 5 + 8 ;
std :: cout << 'p[' << i << '] = ' << p [ i ] << std :: endl ;
}
șterge [ ] p ;
întoarcere 0 ;
}

Aici, puteți vedea că am inițializat matricea cu valori care sunt calculate în timpul rulării și imprimăm toate valorile buclei folosind bucla „for”. Cel mai important lucru de remarcat aici este schimbarea instrucțiunii delete[]; acum este apelat după obținerea tuturor valorilor matricei care a eliminat eroarea de acces la memorie. Vedeți rezultatul final al codului în următoarele:

Concluzie

În concluzie, eroarea „eroare: GDB nu poate accesa memoria la adresa” indică de obicei probleme legate de memorie în codul C++. Acest articol a explorat câteva scenarii comune care inițiază această eroare pentru a explica când și cum poate fi rezolvată. Când această eroare apare în cod, este esențial să o revizuiți cu atenție acordând o atenție deosebită variabilelor pointerului, alocărilor de memorie, matricelor și structurilor.

În plus, caracteristici precum punctele de întrerupere furnizate de GDB pot ajuta la localizarea erorii în timpul depanării programului. Aceste caracteristici pot ajuta la identificarea locației exacte a erorilor legate de memorie. Abordând aceste probleme în mod proactiv, dezvoltatorii pot spori stabilitatea și fiabilitatea aplicațiilor lor C++.