Domanda

    

Questa domanda ha già una risposta qui:

         

Si prega di guardare il codice

int i = 10;                                     //line 1 
int *p = &i;                                    //line 2  
delete p;                                       //line 3 
cout << "*p = " << *p << ", i = " << i << endl; //line 4  
i = 20;                                         //line 5  
cout << "*p = " << *p << ", i = " << i << endl; //line 6  
*p = 30;                                        //line 7
cout << "*p = " << *p << ", i = " << i << endl; //line 8  

Qual è il risultato di questo codice? Soprattutto di linea 3, 5 e 7? Non invocano un comportamento indefinito? Quale sarebbe l'uscita?

EDIT: Ho provato a fare funzionare utilizzando g ++, ed è compilare ed eseguire bene! Sto usando MinGW su Windows 7.

Che cosa dice standard in questo contesto?

È stato utile?

Soluzione

È possibile eliminare solo un puntatore se avete mai assegnato in modo dinamico utilizzando il nuovo. In questo caso non si è assegnato il puntatore utilizzando il nuovo, ma semplicemente definito e inizializzato a punto da una variabile locale di tipo int.

Invocare delete su un puntatore non allocati dinamicamente utilizzando nuova è una cosa chiamata comportamento indefinito . In breve, ciò significa che qualsiasi cosa sulla terra può accadere quando viene eseguito tale codice e non è possibile denuncia un po 'a chiunque su questo pianeta.

Altri suggerimenti

delete p; è UB e così ogni ulteriore comportamento non può essere predetto o invocata. È il programma potrebbe bloccarsi immediatamente o spendere tutti i vostri soldi o semplicemente uscire dal main() e far finta di niente.

La linea 3 è sicuramente un comportamento indefinito, dal momento che si sta cercando di eliminazione di memoria a un indirizzo che non è sul mucchio.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top