2013-04-18 2 views
7

Mi sono imbattuto in questa rete mentre stavo studiando alcune cose relative alla perdita di memoria.cos'è "riferimento sospeso" e "errore di protezione generale"?

int* Function() 

{ 

    int arrays[10]; 

    /* Some code here */ 

    return &(arrays[0]); 

} 

l'autore dice che il pezzo di codice di cui sopra è valido, ma il ricordo che viene restituito verrà riutilizzato dalla funzione successiva si chiama, in modo che la stessa memoria viene utilizzato per due scopi. Questo è chiamato "riferimento sospeso" e può causare errori orribilmente intermittenti o un "errore di protezione generale" vecchio stile.

Sarebbe bello se qualcuno può spiegare ciò che è "appeso riferimento" & "errore di protezione generale"

+2

L'autore non sa molto bene C, o la stai travisando. Il programma ha un comportamento indefinito. –

+2

Questo non fa esattamente la perdita di memoria, poiché l'array assegnato verrà automaticamente rilasciato quando la funzione ritorna. Questo è il significato di un riferimento sospeso, si sta restituendo un puntatore ad una memoria allocata nello stack.Quando la funzione ritorna, l'array allocato allo stack viene deallocato, in modo tale che la posizione in memoria possa essere sovrascritta dai dati per la prossima chiamata di funzione, quindi il dereferenziamento del puntatore restituito darà un valore indefinito. –

+0

Yup sembra un riferimento sospeso significa riferirsi a qualcosa sullo stack che non esiste più. Qualche idea su "errore di protezione generale"? –

risposta

2

non so se queste sono spiegazioni ufficiali, ma spero che dà un senso migliore per questo esempio:

riferimento sospeso: l'istruzione return restituisce un riferimento (puntatore) agli array. Tuttavia, la memoria è (o può essere) rimossa dopo la chiusura della funzione, quindi c'è un riferimento che non punta alla memoria allocata, che è chiamata un riferimento sospeso.

Ciò può provocare un errore di protezione generale. In generale, la memoria non allocata non dovrebbe essere scritta. Se si tenta di farlo, un errore di protezione generale può essere generato dal sistema operativo.

1

arrays viene assegnato in pila quando viene chiamato Function. Function restituisce un indirizzo di una struttura allocata nello stack. Quando Function restituisce il puntatore allo stack viene eseguito lo snap indietro ma i suoi dati sono ancora in pila. Quando l'area di stack precedentemente rilasciata verrà utilizzata da un'altra funzione o ambito, quella funzione scriverà i dati dell'ambito locale in una porzione di stack che è ancora potenzialmente accessibile dal puntatore restituito in precedenza.

Questo ha 2 conseguenze:

  • Se si tenta di accedere ai dati array dall'esterno Function, tali dati non sono più affidabili e saranno (presto o meno) corrotto da un nuovo stanziamento che sovrascrivere quella regione pila .
  • La nuova funzione allocato sullo stack, se non inizializza tutti i suoi campi, potrebbe contenere alcuni dati sporchi

Il risultato è un comportamento indefinito e può dipendere dal compilatore e compilare le opzioni troppo.

2

Questo non ha esattamente perdite di memoria, poiché l'array assegnato verrà automaticamente rilasciato quando la funzione ritorna. Questo è il significato di un riferimento sospeso, si sta restituendo un puntatore ad una memoria allocata nello stack. Quando la funzione ritorna, l'array allocato allo stack viene deallocato, in modo tale che la posizione in memoria possa essere sovrascritta dai dati per la prossima chiamata di funzione, quindi il dereferenziamento del puntatore restituito darà un valore indefinito. Ciò potrebbe causare un errore di protezione generale, poiché il valore del puntatore potrebbe cambiare in modo tale che punti al di fuori dello spazio di indirizzi valido, la mancata definizione di tale puntatore causerebbe un errore di protezione generale.