- •Пример 4.1 - Создание (определение) массивов
- •Пример 4.2 - Выделение памяти под массив
- •Пример 4.4 - Указатели-константы
- •Функция free() с прототипом
- •Вызов функции calloc() с прототипом
- •Пример 4.11 - Операции new и delete в задаче сложения векторов
- •Пример 4.12 – Второй вариант функции сложения векторов
- •Функция с прототипом
Функция 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;
}
В следующем примере приводится вариант функции сложения векторов, которая возвращает адрес массива, хранящего сумму векторов.
