Динамический массив в простейшей реализации представляет собой выделенный операционной системой непрерывный кусок памяти, указатель на его начало и два дополнительных счётчика:
   -  ёмкость выделенной памяти (capacity) 
  -  количество элементов в массиве (оsize) 
  
При попытке добавить элемент в конец массива проверяется условие size < capacity. 
Если оно истинно, то элемент просто добавляется на позицию, соответствующую началу массива плюс смещение на size. 
Если ложно, происходит реаллокация: операционная система выделяет новый большой кусок памяти и в него копируются данные из старого куска, который затем освобождается.