Operatore delete C++

In C++, l’operatore binario delete (con un operando opzionale e l’altro obbligatorio) dealloca la memoria dell’area heap puntata dall’operando (obbligatorio). Non restituisce alcun valore e quindi deve essere usato da solo in un’istruzione (non essendo né un l-value né un r-value non può essere usato in un’espressione con altre operazioni).

Es.:          allocazione:     int* punt = new int ;
deallocazione:  delete punt ;

Contrariamente all’apparenza l’operatore delete non cancella il puntatore né altera il suo contenuto: l’unico effetto é di liberare la memoria puntata rendendola disponibile per ulteriori allocazioni (se l’operando non punta a un’area heap alcuni compilatori generano un messaggio di errore (o di warning), altri no, ma in ogni caso l’operatore delete non ha effetto).

int a=5;
    int *p=new int;//faccio puntare p ad int
    cout<<"Indirizzo di int è contenuto in p ="<<p<<endl;
    
    delete p;
    cout<<"Indirizzo di int è contenuto in p ="<<p<<endl;//si nota che con delete non ho cancellato l'indirizzo
    p=&a;//faccio puntare p ad a però prima devi liberare lo spazio puntato precedente se non continua a puntarlo e mi occupa memoria
    
    //delete p;//non ha effetto perche p puntava ad un oggetto nello stack
    p=new int;
    cout<<"Indirizzo di int è contenuto in p ="<<p<<endl;
    delete p;//ora ha senso perche p puntava ad un oggetto heap
    cout<<"Indirizzo di int è contenuto in p ="<<p<<endl;
    //si nota che delete non cancella l'indirizzo ma libera solo l'area puntata, in modo che possa essere puntata da qualcun altro