Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
44
Добавлен:
16.02.2016
Размер:
1.2 Mб
Скачать

Void *calloc( size_t num, size_t size );

Аргумент num указывает, сколько элементов будет храниться в массиве, а параметр size сообщает размер каждого элемента в байтах. Приведенный здесь тип size_t (объявлен в заголовочном файле stddef .h) является синонимом типа unsigned char, возвращаемого оператором sizeof.

Функция освобождения памяти free в качестве единственного аргумента принимает указатель на удаляемый блок объектов (*block) и имеет синтаксис:

Void free(void *block);

Данная функция подключается в заголовочном файле stdlib.h или alloc.h. Тип объектов удаляемого блока может быть произвольным, на что указывает ключевое слово void.

Рассмотрим пример выделения динамической памяти для десяти объектов типа int, заполнение выделенной области числами от нуля до девяти и освобождение ресурса памяти.

#include <iostream.h>

#include <alloc.h>

Int main(void)

{

Int* pRegion;

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

if ((pRegion =

(int*)malloc(10*sizeof (int)))==NULL)

{

cout « "He достаточно памяти\n";

// Завершить программу, если не

// хватает памяти для выделения

return 1;

}

// Заполнение выделенного блока памяти

for(int i=0; i<10; i++)

*(pRegion+i) = i;

// Вывод значений заполненного блока

for(int i=0; i<10; i++)

{

cout « (*pRegion) « '\n';

pRegion++;

}

// Освобождение блока памяти

free(pRegion);

return 0 ;

}

Пример динамического выделения памяти под двумерный массив Array [10] [20] переменных типа int выглядит следующим образом:

Array = (int*)malloc(10*20*sizeof(int));

В отличие от функций работы с динамической памятью malloc, calloc и free, заимствованных в C++ из стандарта ANSI С для совместимости, новые операторы гибкого распределения памяти new и delete обладают дополнительными возможностями, перечисленными ниже.

• Как отмечалось выше, функции malice и calloc возвращают пустой указатель, который в дальнейшем требуется приводить к заданному типу. Оператор new возвращает указатель на тип, для которого выделялась память, и дополнительных преобразований уже не требуется.

• Операция new предполагает возможность использования совместно с библиотечной функцией set_new_handler, позволяющей пользователю определить свою собственную процедуру обработки ошибки при выделении памяти.

• Операторы new и delete могут быть перегружены с тем, чтобы они, например, могли принимать дополнительные параметры или выполняли специфические действия с учетом конкретной ситуации работы с памятью. Операторы new и delete имеют две формы:

• управление динамическим размещением в памяти единичного объекта:

• динамическое размещение массива объектов. Синтаксис при работе с единичными объектами следующий:

тит_объекта *имя = new тип__объекта;

delete имя;

При управлении жизненным циклом массива объектов синтаксис обоих операторов имеет вид:

тип объекта *имя = new тип_объекта[число];

delete[] имя;

Здесь число в операторе new[] характеризует количество объектов типа тип_объекта, для которых производится выделение области памяти. В случае успешного резервирования памяти переменная-указатель имя ссылается на начало выделенной области. При удалении массива его размер указывать не нужно.

Форма оператора delete должна обязательно соответствовать форме оператора new для данного объекта: если выделение памяти проводилось для единичного объекта (new), освобождение памяти также должно осуществляться для единичного объекта (delete).

В случае применения оператора new[](для массива объектов), в конечном итоге высвобождение памяти должно быть произведено с использованием оператора delete []. К примеру:

#include <iostream.h>

#include <new.h>

Соседние файлы в папке ЛекцииКарасева