Набор функций C (malloc, calloc, realloc, free) является необработанными операциями с памятью. Они будут создавать / изменять / освобождать данный буфер в памяти, но память не будет иметь типа, и конструкторы не будут вызываться.
C ++ не имеет эквивалента realloc , но содержит только безопасные эквиваленты malloc / free с помощью new / new [] и delete / delete [] . Версии C ++ получат память из системы и инициализируют ее, вызывая соответствующие конструкторы. Использование delete вызовет деструкторы объектов и затем освободит память. Версии C и C ++ несовместимы, если вы получаете память с помощью malloc (даже если вы вызываете конструктор на месте полученной памяти), вы не можете освободить ее с помощью delete / delete [] как это неопределенное поведение.
Использование realloc в C ++ может быть небезопасным, поскольку оно будет поразрядно копировать объекты из одной области памяти в другую. Иногда ваши объекты не будут правильно обрабатывать движения памяти (скажем, что ваш объект имеет как атрибут, так и ссылку на него, после побитового перемещения его ссылка будет указывать на старую позицию, а не на реальный атрибут). Внутри vector всякий раз, когда необходимо увеличить память, создается новая память с new [] , а затем все объекты копируются (или копируются) в новых позициях, используя соответствующие Операции C ++ перед удалением старых элементов.
Всякий раз, когда вектор увеличивается в размере (зарезервированный размер, не использованный размер), он создает новую область памяти и перемещает все объекты. С другой стороны, realloc будет перемещать блок памяти в другую позицию только в том случае, если после указателя недостаточно непрерывного пространства, чтобы просто увеличить его. Векторы не уменьшают размер. Никогда. Когда вы очищаете элементы, зарезервированная память все еще удерживается.
Наконец, в vector существует более высокий уровень абстракции, чем в realloc даже для типов POD (которые безопасно перемещать с помощью C-подобных конструкций). Эквивалентом vector будет структура, которая содержит указатель на буфер памяти, количество используемых элементов и зарезервированный (размер буфера), а также набор функций, которые занимаются получением большего объема памяти при необходимости и обновлением индексы с каждой операцией.