Il problema è nel costruttore ... nella lista di inizializzazione

: size( N > 0 ? N : 1 ),
arrayPtr( new T[size] )

il valore della size usato per la new non è quello assegnato con la prima parte ma il valore casuale precedente ...