2013-06-12 19 views
7
#include <iostream> 

int main() 
{ 
    int* i = 0; 
    int x = (*i); 
    std::cout << x; 
} 

Il programma di cui sopra verrà bloccarsi quando compilo ed eseguirlo con Visual Studio 2010 e so si blocca perché ho impostato il puntatore a 0.tenta di accedere a un puntatore nullo

Quello che vorrei sapere, è accesso a null pointer in C++ definito nello standard o è indefinito e mi capita di essere fortunato che il mio programma si è bloccato a causa del mio compilatore/computer/sistema operativo

Se è definito, cosa mi garantisce C++ quando provo e accedere a un puntatore nullo?

+3

Non è definito. –

+1

@ R.MartinhoFernandes Quindi posso aspettarmi che su alcuni computer questo non si arresti? – Caesar

+1

sì, ma puoi anche aspettarti che formatti il ​​tuo hard disk sugli altri – Laurijssen

risposta

8

Il dereferenziamento di un puntatore nullo invocherà il comportamento non definito . Potrebbe risultare in cose diverse su diversi compilatori, anche di più: potrebbero accadere cose diverse sullo stesso compilatore se compilate più volte. Non ci sono garanzie sul comportamento.

2

Ciò che rende il processo in crash qui è il sistema operativo che impedisce al programma di giocherellare con la memoria a cui non ha accesso (all'indirizzo 0). Windows ti darà una "violazione di accesso", Linux/Unix ti darà un "errore di segmentazione".

Inoltre, vedere Why are NULL pointers defined differently in C and C++? per un preventivo di ciò che un puntatore nullo è nello standard

2

E non è definito in C++ in modo che non potrebbe bloccarsi su alcuni sistemi operativi, ma si può contare su un incidente in corrente (e precedenti) versioni di Windows e Linux perché nessuno di questi ti consente (come processo utente) di accedere a tale posizione di memoria.

Inoltre, in Windows, se si desidera causare un'interruzione del programma, provare DebugBreak(); che causa un'eccezione (MSDN dice: provoca un'eccezione del punto di interruzione nel processo corrente. Ciò consente al thread chiamante di segnalare al debugger di gestire l'eccezione).

Problemi correlati