La spiegazione di Michele e' chiara e perfetta.
Solo un annotazione al programma:
ogni volta che la funzione somma() viene chiamata, viene allocato uno spazio di memoria pari a 2*dim byte.
E' importante rilasciate tale area di memoria prima di terminare la chiamata della funzione, in caso contrario, effettuando molteplici chiamate alla funzione somma() si rischia di esaurire tutta la memoria heap disponibile.
( si continua ad allocare memoria, ma non si libera mai....).
In questo caso, alla fine del programma, aggiungi l'istuzione:
delete []res;
Ciao