1)OK
2)OK
3)Il discorso è che bisogna liberare la memoria che si ha creato nell'heap e non quella dello stack.
quindi:
string a;
string* b = &a;
delete b; //errore b punta alla variabile a contenuta nello stack
string* b = new string("albero);
delete b; //ok b punta alla memoria nell'heap
Bisogna liberare solo la memoria nell'heap e non nello stack.