Важно!
Более старые С++-компиляторы могут требовать задания размера удаляемого массива, поскольку в ранних версиях C++ для освобождения памяти, занимаемой удаляемым массивом, необходимо было применять такой формат оператора delete:
delete [размер] переменная-указатель;
Здесь элемент размер задает количество элементов в массиве. Стандарт C++ больше не требует указывать размер при его удалении.
При выполнении следующей программы выделяется память для 10
-элементного массива типа double, который затем заполняется значениями от 100 до 109, после чего содержимое этого массива отображается на экране.
#include
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ее() соответствующая область памяти возвращается системе. Любая программа, которая использует эти функции, должна включать заголовок .Функция malloc()
имеет такой прототип,
void *malloc(size_t num_bytes);
Здесь num_bytes
означает количество байтов запрашиваемой памяти. (Тип size_t представляет собой разновидность целочисленного типа без знака.) Функция malloc() возвращает указатель типа void, который играет роль обобщенного указателя. Чтобы из этого обобщенного указателя получить указатель на нужный вам тип, необходимо использовать операцию приведения типов. В результате успешного вызова функция malloc() возвратит указатель на первый байт области памяти, выделенной из "кучи". Если для удовлетворения запроса свободной памяти в системе недостаточно, функция malloc() возвращает нулевой указатель.Функция free()
выполняет действие, обратное действию функции malloc() в том, что она возвращает системе ранее выделенную ею память. После освобождения память можно снова использовать последующим обращением к функции malloc(). Функция free() имеет такой прототип.
void free(void *ptr);
Здесь параметр ptr
представляет собой указатель на память, ранее выделенную с помощью функции malloc(). Никогда не следует вызывать функцию free() с недействительным аргументом; это может привести к разрушению списка областей памяти, подлежащих освобождению.Использование функций malloc()
и free() иллюстрируется в следующей программе.
// Демонстрация использования функций malloc() и free().
#include
#include
using namespace std;
int main()
{
int *i;
double *j;
i = (int *) malloc(sizeof(int));
if(!i) {
cout << "Выделить память не удалось.\n";
return 1;
}
j = (double *) malloc(sizeof(double));
if(! j ) {
cout << "Выделить память не удалось.\n";
return 1;
}
*i = 10;
*j = 100.123;
cout << *i << ' ' << *j;
// Освобождение памяти.
free (i);
free (j);
return 0;
}