// Concatenate right operand to this object and
// store in this object.
const String &String:perator+=( const String &right )
{
char *tempPtr = sPtr; // hold to be able to delete
length += right.length; // new String length
sPtr = new char[ length + 1 ]; // create space
assert( sPtr != 0 ); // terminate if memory not allocated
strcpy( sPtr, tempPtr ); // left part of new String
strcat( sPtr, right.sPtr ); // right part of new String
delete [] tempPtr; // reclaim old space
return *this; // enables cascaded calls
}
se non ho compreso male, tu devi deallocare il puntatore sPtr, avendolo allocato dinamicamente..
il problema è che il tutto dovrebbe essere trasparente all'utilizzatore, giusto??
se è così, in realtà dovresti bypassare il problema ricordando all'utilizzatore di deallocare quel puntatore.

un situazione simile mi capitò quando feci l'esame di programmazione all'università: il professore mi disse che quella era la soluzione..