Динамическое выделение памяти в языке C

Язык C++ поддерживает также функции malloc(), calloc(), realloc() и free(), позволяющие управлять динамической памятью в языке C. Хотя эти функции можно использовать и в языке C++, тем не менее стоит отдать предпочтение оператору new и явной обработке исключения. Описание этих функций приведено в книге лишь для того, чтобы вы могли разобраться в чужом коде.

Функции malloc() и free()

Для выделения динамической памяти в языке C предназначена функция malloc(). Прототип функции:

#include <cstdlib> /* или #include <stdlib.h> */
void *malloc(size_t size);

Функция malloc() принимает в качестве параметра размер памяти в байтах и возвращает указатель, имеющий тип void *. Если память выделить не удалось, то функция возвращает нулевой указатель. Все элементы будут иметь произвольное значение, так называемый «мусор». В языке C указатель типа void * неявно приводится к другому типу, поэтому использовать явное приведение не нужно. В языке C++ перед присвоением значения указателю необходимо выполнить явное приведение к используемому типу. Кроме того, чтобы программа была машинонезависимой следует применять оператор sizeof для вычисления размера памяти, требуемого для определенного типа.

Освободить ранее выделенную динамическую память позволяет функция free(). Функция принимает в качестве параметра указатель на ранее выделенную память и освобождает ее. Прототип функции:

#include <cstdlib> /* или #include <stdlib.h> */
void free(void *memory);

Пример выделения памяти для одного объекта приведен в листинге 3.17.

Листинг 3.17. Динамическое выделение памяти для одного объекта

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

int main() {
   std::setlocale(LC_ALL, "Russian_Russia.1251");
    // Выделяем память
   int *p = (int *) std::malloc(sizeof(int));
   if (!p) {                     // Проверяем на корректность
      std::cerr << "Не удалось выделить память" << std::endl;
      exit(1);                   // Выходим при ошибке
   }
   *p = 20;                      // Пользуемся памятью
   std::cout << *p << std::endl; // 20
   std::free(p);                 // Освобождаем память
   p = nullptr;                  // Обнуляем указатель
   return 0;
}

Пример выделения памяти под массив приведен в листинге 3.18.

Листинг 3.18. Динамическое выделение памяти под массив

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

int main() {
   std::setlocale(LC_ALL, "Russian_Russia.1251");
   const int ARR_SIZE = 10;
   int *p = (int *) std::malloc(ARR_SIZE * sizeof(int));
   if (!p) {                     // Проверяем на корректность
      std::cerr << "Не удалось выделить память" << std::endl;
      exit(1);                   // Выходим при ошибке
   }
   // Нумеруем элементы массива от 1 до 10
   for (int i = 0; i < ARR_SIZE; ++i) { // Пользуемся памятью
      p[i] = i + 1;
   }
   // Выводим значения
   for (int i = 0; i < ARR_SIZE; ++i) {
      std::cout << p[i] << std::endl;
   }
   std::free(p);                        // Освобождаем память
   p = nullptr;                         // Обнуляем указатель
   return 0;
}

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

Помощь сайту

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

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