[c++] Cos'è un errore di segmentazione?


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 è 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 come 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 ++).



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.




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



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).






Related