Работа с динамической памятью

Как правило, описывается указатель нужного типа, который затем связывается с областью памяти, выделенной оператором new или си-совместимыми функциями для управления ОП.

1. Описать указатель на будущий динамический объект:

int *a;

 //Надёжнее int *a=NULL;

2. Оператором new или функциями malloc, calloc выделить оперативную память:

a = new int [10];

или

#include <malloc.h>

       //stdlib.h, alloc.h в разных компиляторах

//...

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

или

a = (int *) calloc (10,sizeof(int));

В последнем случае мы выделили 10 элементов по sizeof(int) байт и заполнили нулями '\0'.

 

Важно! Не смешивайте эти 2 способа в одном программном модуле или проекте! Предпочтительней new, кроме тех случаев, когда нужно обеспечить заполнение памяти нулевыми байтами.

 

3. Проверить, удалось ли выделить память - если нет, указатель равен константе NULL (в ряде компиляторов null, nullptr, 0):

if (a==NULL) {

 //Обработка ошибка "Не удалось выделить память"

}

 

4. Работа с динамическим массивом или строкой ничем не отличается от случая, когда они статические.

 

5. Когда выделенная ОП больше не нужна, её нужно освободить:

delete a; //Если использовали new

 

free (a); //Пытается освободить ОП,

     //если использовали malloc/calloc

 

Важно! Всегда старайтесь придерживаться принципа стека при распределении ОП. То есть, объект, занявший ОП последним, первым её освобождает

 

Пример. Динамическая матрица размером n*m.

const int n=5,m=4;

int **a = new (int *) [n];

for (int i=0; i<n; i++) a[i] = new int [m];

После этого можно работать с элементами матрицы a[i][j], например, присваивать им значения. Освободить память можно было бы так:

for (int i=n-1; i>-1; i--) delete a[i];

delete a;

 

Задачи к лабораторной 2

 

1. Написать собственную функцию работы со строкой, заданной указателем, сравнить со стандартной.

2. Написать собственную функцию для работы с одномерным динамическим массивом, заданным указателем.

3. Написать свои версии функций преобразования строки в число и числа в строку.




double arrow
Сейчас читают про: