Функция realloc()

Функция realloc() выполняет перераспределение памяти. Прототип функции:

#include <cstdlib> /* или #include <stdlib.h> */
void *realloc(void *memory, size_t newSize);

В первом параметре функция realloc() принимает указатель на ранее выделенную динамическую память, а во втором — новый требуемый размер в байтах. Функция выделит динамическую память длиной newSize, скопирует в нее элементы из старой области памяти, освободит старую память и вернет указатель на новую область памяти. Новые элементы будут иметь произвольные значения, так называемый «мусор». Если новая длина меньше старой длины, то лишние элементы будут удалены. Если память не может быть выделена, то функция вернет нулевой указатель, при этом старая область памяти не изменяется (в этом случае возможны утечки памяти, если значение присваивается прежнему указателю).

Если в первом параметре указать значение NULL, то будет выделена динамическая память и функция вернет указатель на нее. Если во втором параметре указано значение 0, то ранее выделенная динамическая память освобождается и функция вернет нулевой указатель.

Пример использования функции realloc() приведен в листинге 3.21.

Листинг 3.21. Функция realloc()

#include <iostream>
#include <cstdlib>
#include <process.h>

int main() {
   int arr_size = 5;
   int *p = (int *) std::malloc(arr_size * sizeof(int));
   if (!p) exit(1);                // Выходим при ошибке
   // Нумеруем элементы массива
   for (int i = 0; i < arr_size; ++i) {
      p[i] = i + 1;
   }
   // Увеличиваем количество элементов
   arr_size += 2;
   p = (int *) std::realloc(p, arr_size * sizeof(int));
   // Здесь возможна утечка памяти, если realloc() вернет NULL
   if (!p) exit(1);                // Выходим при ошибке
   p[5] = 55;
   p[6] = 66;
   // Выводим значения
   for (int i = 0; i < arr_size; ++i) {
      std::cout << p[i] << ' ';
   } // 1 2 3 4 5 55 66
   std::free(p);                        // Освобождаем память
   p = nullptr;                         // Обнуляем указатель
   return 0;
}

В языке C++ вместо функций malloc(), calloc() и realloc() лучше использовать класс vector, который реализует динамический массив. Следить за размерами динамического массива нет необходимости, т. к. управление динамической памятью осуществляется автоматически:

// #include <vector>
std::vector<int> arr;
// Добавляем элементы в массив
for (int i = 0; i < 5; ++i) arr.push_back(i + 1);
// Увеличиваем количество элементов
arr.push_back(55);
arr.push_back(66);
// Выводим значения
for (int item : arr) {
   std::cout << item << ' ';
} // 1 2 3 4 5 55 66

Учебник C++ (MinGW-W64)
Учебник C++ (MinGW-W64) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов