Механизм динамического выделения памяти в контейнерах C++ работает через использование распределителей памяти (аллокаторов). 5 Они преобразуют запросы на выделение памяти в физическую операцию её выделения. 5
Например, когда просят вектор изменить размер, он смотрит, что ещё не зарезервировал нужное число байтов (буфер вектор всегда выделяет с запасом), после чего выделяет новый буфер. 1 Все существующие элементы переносятся в новый буфер конструктором перемещения через размещающий new по соответствующему адресу. 1 В результате все элементы стоят на своих местах. 1 После этого вектор добирает нужное число элементов в конец массива, создавая каждый размещающим new и конструктором по умолчанию. 1
Также логика работы с динамической памятью инкапсулирована в специальных классах std::uniqueptr и std::sharedptr, которые называют умными указателями. 2 При конструировании такого объекта происходит выделение памяти, а при вызове деструктора — освобождение. 2