L'eliminazione di un puntatore ad una variabile automatica [duplicato]
-
30-09-2019 - |
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?
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.