Управление динамической памятью — КиберПедия 

Состав сооружений: решетки и песколовки: Решетки – это первое устройство в схеме очистных сооружений. Они представляют...

Типы сооружений для обработки осадков: Септиками называются сооружения, в которых одновременно происходят осветление сточной жидкости...

Управление динамической памятью

2023-01-02 16
Управление динамической памятью 0.00 из 5.00 0 оценок
Заказать работу

• Динамически распределяемая область памяти – это свободная область памяти, не используемая программой, операционной системой или другими программами (англ. heap – «куча»).

• С++ включает набора средств, позволяющих организовать работу с динамически выделяемой памятью: унаследованный от С и реализованный в С++.

• В программе не следует смешивать использование средств разных языков.

Управление динамической памятью

• Основу системы динамического распределения памяти в С составляют библиотечные функции calloc (), malloc (), realloc () и free ().

• Для работы с динамической памятью в С++ используют специальные операторы new и delete.

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

Функция calloc()

void *calloc(size_t num, size_t size);

size – параметр, определяющий размер выделяемой области;

num – количество областей.

• Функция calloc () выделяет память, размер которой равен значению выражения num * size.

•  Выделенная область памяти обнуляется.

• Функция calloc () возвращает указатель на первый байт выделенной области или NULL, если запрос на память выполнить нельзя.

Функция calloc()

• Тип void может быть переопределен для требуемого типа, т. е. для char, int, float, double.

double *ptr;

ptr = (double *)

   (calloc(10, sizeof(double)));

if (!ptr) // условие логического отрицания

{printf("Out of memory. Press any        key:\n");

_getch(); exit(1);

}

Функция calloc()

int * list;

list = (int *) calloc(3,sizeof(int));

* list =-244;

*(list+1)=15;

*(list+2)=-45;

free(list);

Функция malloc()

void *malloc (size_t size);

size – параметр, определяющий размер выделяемой области.

• Функция malloc () возвращает указатель на первый байт области памяти размера size или NULL, если запрос на память выполнить нельзя.

• Выделенная область памяти не инициализируется.

Функция malloc()

int *a;

If

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

{

printf("Память для числа не                                                 выделена.");

exit(1);

}

*a=-244;

*a+=10;

free(a);

Функция realloc()

void *realloc(void *ptr, size_t size);

* ptr - указатель,

size –размер выделяемой области.

• Функция realloc () изменяет размер блока ранее выделенной памяти. Значение параметра size может быть больше или меньше, чем перераспределяемая область.

• Возвращает указатель на блок памяти, т.к. бывает необходимо переместить этот блок.

• Если новый размер памяти больше старого, дополнительное пространство не инициализируется.

Функция realloc()

Int input,n;

int count=0;

int *numbers = NULL;

int *more_numbers;

do {

printf ("Enter an integer value

                         (0 to end): ");

scanf ("%d", &input);

count++;

more_numbers = (int*)

realloc(numbers,count * sizeof(int));

Функция realloc()

if (more_numbers!=NULL) {

  numbers=more_numbers;

  numbers[count-1]=input; }

else {

  free (numbers);

  puts ("Error (re)allocating                                             memory");

  exit (1); }

} while (input!=0);

printf ("Numbers entered: ");

for (n=0;n<count;n++)

printf ("%d ",numbers[n]);

Функция free()

void free(void *ptr);

ptr – параметр, определяющий адрес освобождаемого блока памяти.

• Функция free () возвращает в динамически распределяемую область памяти блок, после чего эта память становится доступной для выделения в будущем.

• Вызов функции free () должен выполняться только с указателем, который был получен ранее в результате вызова одной из функций динамического распределения памяти.

Функция free()

#include <stdio.h>

#include <stdlib.h>

int main () {

int *buf1, *buf2, *buf3;

buf1 = (int*) malloc(100*sizeof(int));

buf2 = (int*) calloc(100,sizeof(int));

buf3=(int*)realloc(buf2,50*sizeof(int));

free (buf1);

free (buf3);

return 0;

}

Операторы new и delete

Выделение памяти под одно значение:

<Типизированный указатель> =

new <Тип>[(<Значение>)];

  <Тип> – тип значения, под размещение которого выделяется память – определяет размер памяти, выделяемый данным оператором;

<Значение> – инициализирующее значение.

Освобождение памяти, выделенной под одно значение:

delete <Типизированный указатель>;

Операторы new и delete

Выделение памяти под несколько значений:

< Указатель > = new< Тип >[< Количество >];

<Тип> – тип значения, под размещение которого выделяется память – определяет размер памяти, выделяемый данным оператором;

<Количество> – количество значений, которое необходимо разместить в памяти.

Операторы new и delete

Освобождение памяти, выделенной под несколько значений.

 

delete[] <Типизированный указатель>;

Квадратные скобки присутствуют в операторе и указывают, что освобождается несколько значений, память под которые отводилась одним оператором new:

Операторы new и delete

int *k;

k = new int;

*k = 85;

delete k;

int *a;

if ((a = new int(-244))==NULL) {

printf("Память для числа не                                            выделена.");

exit(1);

}

delete a;

Операторы new и delete

short *list;

list = new short[3];

*list=-244;

*(list+1)=15;

*(list+2)=-45;

delete[] list;

Операторы new и delete

int i,n; int *p;

cout << "How many numbers would you like to                                          type? ";

cin >> i;

p = new int[i];

if (p == 0) cout << "Error: memory could                              not be allocated";

else {

for (n=0; n<i; n++) {

cout << "Enter number: ";

cin >> p[n];

}

cout << "You have entered: ";

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

delete[] p;

}


Поделиться с друзьями:

Автоматическое растормаживание колес: Тормозные устройства колес предназначены для уменьше­ния длины пробега и улучшения маневрирования ВС при...

Архитектура электронного правительства: Единая архитектура – это методологический подход при создании системы управления государства, который строится...

История создания датчика движения: Первый прибор для обнаружения движения был изобретен немецким физиком Генрихом Герцем...

Биохимия спиртового брожения: Основу технологии получения пива составляет спиртовое брожение, - при котором сахар превращается...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.007 с.