Occhio che se implementi un costruttore di copia e un distruttore è abbastanza imprescindibile implementare anche l'operatore di assegnazione, altrimenti con quello di default rischi problemi di questo tipo:
Per implementare correttamente l'operatore di assegnazione senza ripetersi e senza rischiare di finire in uno stato inconsistente in caso di eccezioni la tecnica più semplice e sicura è il "copy & swap" .codice:{ Foo f("abcd"); { Foo g(""); g=f; // g copia il *puntatore* contenuto in f } // g viene distrutto e fa la delete[] del puntatore contenuto al suo interno, che è lo stesso di f } // f viene distrutto, crash! la memoria a cui puntava è già stata deallocata!