Se non intendi usare unique_ptr puoi scrivere:
codice:
Prova& Prova::operator=(const Prova& da_copiare) {
    TipoPuntatore* temp = da_copiare.mPuntatore->clone();
    delete mPuntatore;
    mPuntatore = temp;
    return *this;
}
In questo caso se la prima riga lancia un'eccezione, mPuntatore di Prova è preservato. Viceversa se prima fai il delete di mPuntatore e poi fai la copia, perdi tutto.
In casi simili, si usa un puntatore temporaneo e poi se tutto va bene si procede a cancellazione e copia, altrimenti si perdono capra e cavoli.
Con l'operatore di copia non ho questo rischio in quanto sto creando l'oggetto, ho capito giusto?
Esatto.