c++ - Cos'è un errore di segmentazione?


6 Answers

Vale la pena notare che l'errore di segmentazione non è causato dall'accesso diretto a un'altra memoria di processo (questo è ciò che sento a volte), poiché semplicemente non è possibile. Con la memoria virtuale ogni processo ha il proprio spazio di indirizzamento virtuale e non c'è modo di accedere a un altro utilizzando qualsiasi valore del puntatore. Eccezioni a questo possono essere le librerie condivise che sono lo stesso spazio di indirizzamento fisico mappato a (possibilmente) diversi indirizzi virtuali e memoria del kernel che viene anche mappata nello stesso modo in ogni processo (per evitare il flush di TLB su syscall, penso). E cose come shmat;) - questi sono quelli che considero un accesso "indiretto". Si può, tuttavia, controllare che di solito si trovino lontano dal codice di processo e di solito siamo in grado di accedervi (questo è il motivo per cui sono lì, tuttavia accedervi in ​​modo improprio produrrà un errore di segmentazione).

Tuttavia, l'errore di segmentazione può verificarsi in caso di accesso alla propria memoria (processo) in modo improprio (ad esempio cercando di scrivere in uno spazio non scrivibile). Ma la ragione più comune è l'accesso alla parte dello spazio di indirizzamento virtuale che non è affatto mappato a uno fisico.

E tutto questo per quanto riguarda i sistemi di memoria virtuale.

Question

Cos'è un errore di segmentazione? È diverso in C e C ++? In che modo sono correlati i difetti di segmentazione e i puntatori penzolanti?




Per essere onesti, come hanno menzionato altri manifesti, Wikipedia ha un ottimo articolo su questo, quindi dai un'occhiata qui. Questo tipo di errore è molto comune e spesso chiamato altre cose come violazione di accesso o errore di protezione generale.

Non sono diversi in C, C ++ o in qualsiasi altra lingua che consente puntatori. Questi tipi di errori sono solitamente causati da puntatori che lo sono

  1. Usato prima di essere inizializzato correttamente
  2. Usato dopo che la memoria a cui puntano è stata riallocata o cancellata.
  3. Utilizzato in un array indicizzato in cui l'indice è esterno ai limiti dell'array. Questo è generalmente solo quando stai facendo calcoli matematici su array tradizionali o c-string, non su raccolte basate su STL / Boost (in C ++).



Secondo wikipedia:

Un errore di segmentazione si verifica quando un programma tenta di accedere a una posizione di memoria a cui non è consentito l'accesso o tenta di accedere a una posizione di memoria in un modo non consentito (ad esempio, tentando di scrivere in una posizione di sola lettura o sovrascrivere parte del sistema operativo).




L'errore di segmentazione si verifica quando un processo (istanza in esecuzione di un programma) tenta di accedere all'indirizzo di memoria di sola lettura o all'intervallo di memoria che viene utilizzato da un altro processo o accede all'indirizzo di memoria inesistente (non valido). Problema di riferimento (puntatore) di Dangling significa che prova ad accedere ad un oggetto o variabile il cui contenuto è già stato cancellato dalla memoria, ad esempio:

int *arr = new int[20];
delete arr;
cout<<arr[1];  //dangling problem occurs here



In parole semplici: errore di segmentazione è il sistema operativo che invia un segnale al programma dicendo che ha rilevato un accesso illegale alla memoria e sta terminando prematuramente il programma per impedire che la memoria venga danneggiata.




Ci sono molte buone spiegazioni di "Errore di segmentazione" nelle risposte, ma poiché con un errore di segmentazione spesso c'è un dump del contenuto di memoria, volevo condividere dove la relazione tra la parte "core dumped" in Segmentation fault (core dumped) e la memoria proviene da:

Dal 1955 al 1975 circa - prima della memoria dei semiconduttori - la tecnologia dominante nella memoria del computer utilizzava minuscole ciambelle magnetiche infilate su fili di rame. Le ciambelle erano conosciute come "nuclei di ferrite" e la memoria principale, quindi "core memory" o "core".

Preso da here .




Related