Error: 'GDB no pot accedir a la memòria a l'adreça' en C++

Error Gdb No Pot Accedir A La Memoria A L Adreca En C



La depuració és una part essencial del procés quan es desenvolupen aplicacions en C++ o qualsevol altre llenguatge de programació. Crear aplicacions en C++ no és fàcil; implica bones habilitats d'estructura de dades, habilitats de correcció d'errors i gestió de les eines de depuració. El GDB, GNU Debugger, és una eina eficient que ajuda els desenvolupadors a identificar i resoldre els errors del seu codi. GDB és una eina interessantment senzilla i útil que ajuda els desenvolupadors a trobar i corregir els errors del codi.

Tanmateix, mentre utilitzeu GDB, podeu trobar l'error 'error: GDB no pot accedir a la memòria a l'adreça'. Aquest error pot ser confús i dificulta continuar depurant. Aquest article se centra a identificar per què es produeix aquest error i a veure alguns exemples de codi que ens ajuden a entendre com resoldre aquest error.

Exemple 1:

Vegem el nostre primer exemple de codi que, després de l'execució, dóna un error 'GDB no pot accedir a la memòria a l'adreça'. Primer, mirem el codi. Aleshores, veurem l'explicació línia per línia.







#include
utilitzant espai de noms std ;
int principal ( buit ) {
int * pàg ;
cout << * pàg ;
}

El programa comença amb la declaració de la directiva del preprocessador '#include ' i utilitzant l''espai de noms std' que són essencials per ser inclosos al programa per utilitzar les funcions estàndard d'entrada i sortida. Després d'això, ve el punt d'entrada principal que és 'int main(void);'. Aquesta línia declara el punt de partida del programa.



Dins de la funció principal, es declara la variable punter '*p'. Aquí, la variable 'p' no està inicialitzada. Per tant, no apunta a cap ubicació de memòria específica reservada per a l'enter. Aquesta línia provoca un error que resoldrem més endavant. A la línia següent, intentem imprimir el valor de la variable '*p' mitjançant la instrucció 'cout'.



Com que la variable 'p' és un punter de tipus enter, l'asterisc '*' s'utilitza per desreferenciar-la. Això vol dir que el valor es troba a la ubicació de memòria a la qual apunta. Tanmateix, com que el punter 'p' no s'ha inicialitzat i no apunta a cap ubicació específica i vàlida, desreferenciar el punter donarà lloc a un comportament indefinit. Per tant, genera diversos tipus d'errors segons el sistema i el compilador. Com que estem utilitzant el compilador GDB per depurar i executar aquest programa, el depurador llançarà el següent error. L'error es mostra al fragment de sortida:





Com podeu veure a la sortida, el depurador no pot accedir a la memòria. Aquest programa anul·la la referència a un punter no inicialitzat, la raó principal d'aquest comportament no definit. Ara, anem a veure com podem resoldre aquest problema. El codi correcte es dóna a continuació. Fes-hi una ullada i t'explicarem com corregim l'error al codi:



#include
utilitzant espai de noms std ;
int principal ( buit ) {
int val = 5 ;
int * pàg = & val ;
cout << 'El valor és = ' << * pàg ;

}

Com podeu veure, el codi es modifica mitjançant la inclusió de 'int val =5;' declaració. Aquesta línia declara una variable entera anomenada 'val' i la inicialitza amb un valor de '5'. La línia següent, 'int *p = &val;', declara una variable punter '*p' i s'inicialitza per apuntar a l'adreça de la variable 'val'. Anteriorment, el punter '*p' no apuntava a cap adreça de memòria que provocava que 'no es pot accedir a la memòria a l'adreça 0x0'.

Per resoldre aquest problema, la variable 'var' es declara, inicialitza i s'assigna al punter '*p'. Ara, el punter '*p' apunta a l'adreça de la variable 'val' ja que l'operador '&' pren l'adreça de 'val' i l'assigna a 'p'. De nou, la instrucció 'cout' s'utilitza per imprimir el valor del punter '*p'. Consulteu el fragment de sortida següent per veure el valor de la 'val' a la qual s'accedeix el punter '*p':

Com podeu observar, l'error s'ha resolt i el valor de “5” s'inicia ja que la variable “val” s'ha impresa cridant al punter “*p” valribale.

Exemple 2:

Considerem un altre exemple que explica com atendre l'error 'GDB no pot accedir a la memòria a l'adreça' al programa de codi C++. El codi es proporciona a continuació per a la vostra referència. Fes un cop d'ull:

#inclou
int principal ( ) {
int * pàg = nou int [ 15 ] ;
esborrar [ ] pàg ;
std :: cout << pàg [ 2 ] << std :: endl ;
tornar 0 ;
}

Un dels escenaris més habituals que es troben els desenvolupadors durant la programació amb punters és l'assignació de memòria incorrecta o incorrecta. El GDB provoca l'error sempre que es produeix una assignació i desassignació de memòria incorrectes en un programa C++.

Tenint en compte l'exemple de codi anterior, un punter '*p' s'inicializa amb un nou int[15]. Aquesta declaració assigna dinàmicament una matriu de 15 nombres enters utilitzant l'operador new. La variable punter '*p' emmagatzema l'adreça de memòria de la matriu.

A la declaració següent, 'suprimir[] p;', afirma que la memòria s'ha desassignat mitjançant l'ordre delete[]. L'ordre delete[] desassigna la memòria prèviament assignada del punter '*p', la qual cosa significa que l'altre sistema que utilitza pot tornar a assignar el bloc de memòria assignat anteriorment. Quan intentem imprimir el valor de la variable '*p' mitjançant la instrucció 'cout', obtindrem l'error d'accés a la memòria tal com es veu a la sortida següent:

El que cal tenir en compte aquí és que el missatge d'error exacte pot variar lleugerament segons la versió i el sistema de GDB. Però l''error: GDB no pot accedir a la memòria a la ubicació' i l'error indicat al fragment anterior són els mateixos. Per resoldre aquest error, simplement canviem l'ordre delete[] després de la instrucció 'cout'. Vegeu el codi modificat a continuació:

#inclou
int principal ( ) {
int * pàg = nou int [ 15 ] ;
per ( int i = 0 ; i < 15 ; ++ i ) {
pàg [ i ] = i * 2 - 5 + 8 ;
std :: cout << 'p[' << i << '] = ' << pàg [ i ] << std :: endl ;
}
esborrar [ ] pàg ;
tornar 0 ;
}

Aquí, podeu veure que hem inicialitzat la matriu amb valors que es calculen en temps d'execució i imprimim tots els valors del bucle mitjançant el bucle 'for'. El més important a tenir en compte aquí és el canvi de la sentència delete[]; ara es crida després d'obtenir tots els valors de la matriu que ha eliminat l'error d'accés a la memòria. Vegeu la sortida final del codi a continuació:

Conclusió

En conclusió, l'error 'error: GDB no pot accedir a la memòria a l'adreça' sol indicar problemes relacionats amb la memòria al codi C++. Aquest article va explorar alguns escenaris habituals que inicien aquest error per explicar quan i com es pot resoldre. Quan es produeix aquest error al codi, és essencial revisar-lo detingudament prestant molta atenció a les variables del punter, les assignacions de memòria, les matrius i les estructures.

A més, funcions com els punts d'interrupció proporcionats per GDB poden ajudar a localitzar l'error mentre es depura el programa. Aquestes funcions poden ajudar a identificar la ubicació exacta dels errors relacionats amb la memòria. En abordar aquests problemes de manera proactiva, els desenvolupadors poden millorar l'estabilitat i la fiabilitat de les seves aplicacions C++.