Предположим, у меня есть массив символов, выделенный с помощью new.Now, если я хочу изменить размер массива, какой из следующих двух является лучшим методом?
1. используя функцию realloc ИЛИ ЖЕ
2. Выделите новый массив, скопируйте данные из старого массива в новый массив и затем удалите старый массив.
Выделите блок, используя malloc (не new), а затем используйте realloc. realloc знает, сколько свободного места доступно после блока для расширения.
s2 = realloc(s,<size>);
if (s2) {
s = s2;
}
else {
free up s and handle the error
}
Большая часть кода, который я видел, неправильно обрабатывает сбой realloc.
Вы не можете переносить realloc на буфер, выделенный с помощью new. Следовательно, возможен только второй вариант.
Попробуйте переключиться на std :: vector и std :: string.
Я думаю, что вы думаете обо всем этом с точки зрения Си.
если вы имеете дело с массивом, используйте vector
Это динамично и позволяет избежать проблем, которые вы указали в своем вопросе.
например
vector v(10); // allocates an array of 10 initialized to 0
v.push_back(42); // added another, so now array is 11 long
Первый вариант также предполагает копирование, если realloc
обнаруживает, что после блока недостаточно свободного места. (Даже если вы использовали malloc
для выделения массива, который является единственным правильным вариантом для использования realloc
совсем.)
Однако, если вы удваиваете размер массива при каждом перераспределении (или умножаете его размер на константу> 1), операция «увеличить массив на единицу» использует постоянная время в среднем. Ищи Постоянное амортизированное время.
Предположим, что массив начального размера n. Перераспределение на новый размер 2n и копирование стоит 2n шагов, но следующая операция n «увеличения» бесплатна.
Кстати, это как std::vector
и многие другие контейнеры массивов реализованы внутри.