Fondamentalmente l'allocazione dinamica la utilizzi quando non è nota a priori (in fase di compilazione) la dimensione della struttura dati oppure quando devi utilizzare grandi quantità di dati.
Per es. se devi lavorare su un vettore di interi, se conosci già la dimensione (per es. 10) allora puoi scrivere
int vett[10];
ma se la dimensione viene inserita ad esempio dall'utente (e quindi non è nota in fase di compilazione) devi scrivere
int *vett;
vett = new ...
In quest'ultimo caso la sequenza solita è
a) determinare dimensione da allocare (es. con input da utente)
b) allocare vettore
c) verificare corretta allocazione
d) usare il vettore
e) delete del vettore
Talvolta, o molto spesso se consideriamo le stringhe C (array di char), anche se la dimensione non è nota a priori viene considerato un "tetto massimo": es.
char str[80];
fgets( str, 80, fp );
ovvero in questo caso considero che non ha senso avere una stringa più lunga di 80.
Spero che questa semplice descrizione ti sia di aiuto