L'indirizzo e' differente perche' viene chiamato l'operatore delete [] al posto del delete.
In effetti mi ero dimenticato di mostrarti che l'operatore delete [] e' definito con
codice:
void operator delete[]( void * p )
{
RTCCALLBACK(_RTC_Free_hook, (p, 0))
operator delete(p);
}
e come puoi vedere (a meno della prima indicazione che e' usata solamente per il debug), il tutto si risolve alla corrispondente chiamata all'operatore delete a cui viene passato il puntatore originale. Avviene tutto all'interno del codice dell'operatore delete.
E poi perche' parli di "primo elemento"? La deallocazione avviene del "blocco di memoria" costituito dallo spazio necessario ad allocare n puntatori, spazio che e' contiguo in memoria.