Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
4_Proizvodnye_tipy.doc
Скачиваний:
5
Добавлен:
01.07.2025
Размер:
185.34 Кб
Скачать

Функция free() с прототипом

void free (

// Адрес блока памяти

void* pMem);

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

Пример 4.8 - Применение функций malloc() и free()

#include <malloc.h> // или #include <stdlib.h>

#include <stdio.h>

void main (void) {

int* pInt;

// Выделение памяти для 10 объектов типа int

pInt = (int*)malloc (10*sizeof(int));

// Проверка результата вызова функции malloc()

if (pInt == NULL){

printf ("Memory is not allocated! \n");

return;

}

printf ("Memory allocated! \n");

// Использование выделенной памяти

// …

// Возвращение выделенной памяти

free ((void*)pInt);

printf ("Память возвращена\n");

}

Вызов функции calloc() с прототипом

void* calloc (

// Количество объектов

unsigned int uCountUnit,

// Объем памяти для одного объекта в байтах

unsigned int uSizeUnit);

приводит к такому же результату, что и вызов функции malloc() с параметром uCountUnit*uSizeUnit.

В современных редакциях языка Си для получения нужного объема памяти в ходе выполнения приложения служит унарная операция, обозначаемая словом . Ее единственным операндом является идентификатор типа объекта, для которого выделяется память. Если Type - тип объекта, то результатом выполнения операции new Type является адрес типа Type* выделенного блока памяти. Если память не выделена, то результатом является нуль типа Type*.

Пример 4.9 - Применение операции new

// Выделение памяти для объекта типа int

int* pInt=new int;

// Выделение памяти для массива типа char[10]

char* pChar=new char[10];

// Выделение памяти для указателя на float

float** ppf=new float*;

Для освобождения ранее выделенной памяти применяются унарные операции с именами delete и delete[]. В первом случае операндом операции является адрес объекта основного типа данных или адрес адреса, а во втором случае - адрес массива.

Пример 4.10 - Применение операции delete

// Возвращение ранее выделенной памяти

delete pInt;

delete[] pChar;

delete ppf;

Присутствие в тексте приложения команды повторного освобождение уже освобожденной памяти является ошибкой, которая компилятором не обнаруживается. При выполнении этой команды компьютер попадает в бесконечный цикл, для выхода из которого требуется помощь программиста.

Рассмотрим использование операций new и delete на примере программы сложения двух векторов, размерность которых программисту неизвестна. Она вводится с клавиатуры только на этапе выполнения приложения. Для сложения векторов используется функция AddVec().

Пример 4.11 - Операции new и delete в задаче сложения векторов

#include <stdio.h>

// Функция сложения векторов

void AddVec(

// Адрес первого слагаемого

int* pA,

// Адрес второго слагаемого

int* pB,

// Адрес суммы векторов

int* pC,

// Длина векторов

int Dim){

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

pC[i]=pA[i]+pB[i];

// Или, по-другому,

// *(pC+i)=*(pA+i)+*(pB+i);

}

void main(void) {

// Создание переменной для хранения размерности

int Dim;

// Предупреждение о вводе

printf("Input Dim: ");

// Ввод

scanf("%d", &Dim);

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

int* pA=new int[Dim],

* pB=new int[Dim],

* pC=new int[Dim];

// Проверка результатов выполнения операций new

if(!(pA&&pB&&pC)){

// Действия при неудачном выполнении new

printf("Memory is not allocated! \n");

return;

}

// Ввод координат первого слагаемого

printf("Input A \n");

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

scanf("%d", pA+i);

// Ввод координат второго слагаемого

printf("Input B \n");

for(i=0; i<Dim; i++)

scanf("%d", pB+i);

// Вычисление суммы векторов

AddVec(pA,pB,pC,Dim);

// Вывод компонент суммы

for(i=0; i<Dim; i++)

printf("%d ", pC[i]);

printf("\n");

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

delete[] pA;

delete[] pB;

delete[] pC;

}

В следующем примере приводится вариант функции сложения векторов, которая возвращает адрес массива, хранящего сумму векторов.