Выбрать главу

#include <iostream>

using namespace std;

int main()

{

 int *p;

 p = new int (99); // Инициализируем память числом 99.

 cout << *p; // На экран выводится число 99.

 delete p;

 return 0;

}

Выделение памяти для массивов

С помощью оператора new можно выделять память и для массивов. Вот как выглядит общий формат операции выделения памяти для одномерного массива:

переменная-указатель = new тип [размер];

Здесь элемент размер задает количество элементов в массиве.

Чтобы освободить память, выделенную для динамически созданного массива, используйте такой формат оператора delete:

delete [] переменная-указатель;

Здесь элемент переменная-указатель представляет собой адрес, полученный при выделении памяти для массива (с помощью оператора new). Квадратные скобки означают для C++, что динамически созданный массив удаляется, а вся область памяти, выделенная для него, автоматически освобождается.

Важно! Более старые С++-компиляторы могут требовать задания размера удаляемого массива, поскольку в ранних версиях C++ для освобождения памяти, занимаемой удаляемым массивом, необходимо было применять такой формат оператора delete:

delete [размер] переменная-указатель;

Здесь элемент размер задает количество элементов в массиве. Стандарт C++ больше не требует указывать размер при его удалении.

При выполнении следующей программы выделяется память для 10-элементного массива типа double, который затем заполняется значениями от 100 до 109, после чего содержимое этого массива отображается на экране.

#include <iostream>

using namespace std;

int main()

{

 double *p;

 int i;

 p = new double [10]; // Выделяем память для 10-элементного массива. 

 //Заполняем массив значениями от 100 до 109.

 for(i=0; i<10; i++) р[i] = 100.00 + i;

 // Отображаем содержимое массива.

 for(i=0; i<10; i++) cout << p[i] << " ";

 delete [] p; // Удаляем весь массив.

 return 0;

}

При динамическом выделении памяти для массива важно помнить, что его нельзя одновременно и инициализировать.

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

Язык С не содержит операторов new или delete. Вместо них в С используются библиотечные функции, предназначенные для выделения и освобождения памяти. В целях совместимости C++ по-прежнему поддерживает С-систему динамического распределения памяти и не зря: в С++-программах все еще используются С-ориентированные средства динамического распределения памяти. Поэтому им стоит уделить внимание.

Ядро С-системы распределения памяти составляют функции malloc() и free(). Функция malloc() предназначена для выделения памяти, а функция frее() — для ее освобождения. Другими словами, каждый раз, когда с помощью функции malloc() делается запрос, часть свободной памяти выделяется в соответствии с этим запросом. При каждом вызове функции frее() соответствующая область памяти возвращается системе. Любая программа, которая использует эти функции, должна включать заголовок <cstdlib>.

Функция malloc() имеет такой прототип,

void *malloc(size_t num_bytes);

Здесь num_bytes означает количество байтов запрашиваемой памяти. (Тип size_t представляет собой разновидность целочисленного типа без знака.) Функция malloc() возвращает указатель типа void, который играет роль обобщенного указателя. Чтобы из этого обобщенного указателя получить указатель на нужный вам тип, необходимо использовать операцию приведения типов. В результате успешного вызова функция malloc() возвратит указатель на первый байт области памяти, выделенной из "кучи". Если для удовлетворения запроса свободной памяти в системе недостаточно, функция malloc() возвращает нулевой указатель.