Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции.docx
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
933 Кб
Скачать
☆

15.4. Динамические объекты

До сих пор для всех объектов, рассматриваемых в пособии, память выделялась по информации программы автоматически. Для объектов класса памяти static и extern во время трансляции в статической области, для объектов класса памяти auto и register динамически (во время выполнения) в области, называемой программным стеком. Однако, в языке C, как и во многих других языках программирования, имеется возможность выделять память под программные объекты прямым указанием программиста. Такие объекты располагаются в отдельной области – куче (heap). Их принято называть динамическими.

Для этих целей в языке C++ используются операторы new и delete.

Формат:

new <тип>[<выражение>]

Выражение используется при выделении памяти под массив. Результат действия оператора – указатель на данный тип.

Пример.

short *shortp = new short; // Выделение памяти под целое значение

*shortp = 10;

struct str{

char name[40];

short m;

};

str *pstr = new str[*shortp]; // Выделение памяти под 10 элементов типа str

Формат:

delete [ [ ] ]<указатель>

Оператор delete освобождает только память, выделенную оператором new. Квадратные скобки в операторе применяются при освобождении памяти для массива.

Если памяти не хватает, то оператор new возвращает значение NULL. Освободить память в куче можно только оператором delete.

Объекты в куче имен не имеют и работа с ними выполняются исключительно с помощью указателей. Часто говорят, что куча - это неименованная область памяти. Для того, чтобы сделать программу независимой от компьютера и операционной системы, при выделении памяти используют оператор sizeof(<тип>).

Пример.

sizeof(short)  2 байта

sizeof(DATA)  размер определяется по объявлению типа DATA.

Пример. Динамическое выделение памяти под массив заданного размера n.

char *p=new char[n];

Примеры. Манипуляции с массивом произвольного размера.

float *ptr, buf;

short i, n;

........................................

printf("Длина массива:"); scanf("%hd", &n);

/* Выделить память под массив */

ptr=new float[n]);

/* Ввести массив */

printf("Исходный массив\n");

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

scanf("%f", &buf); *(ptr + i ) = buf; // ptr[ i ] = buf;

}

.................................

delete [ ] ptr;

Функция substr – аналог функции Mid языка Basic.

#include <string.h>

// Выделить из строки s подстроку длиной length с позиции begin

// Если length == 0, выделяется подстрока с begin до конца s

char* substr(char *s, short begin, short length){

char* p; // Подстрока

short i;

if(length == 0) length = strlen(s) – begin + 1; // До конца строки s

/* Обработка ошибки */

if(begin < 1 || length < 1 || begin + length – 1 > strlen(s))return NULL;

p=new char [length+1];

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

*(p + i) = *(s + begin + i - 1);

}

*(p + i) = 0;

return p;

} // End substr

Замечание 1. В функции память выделяется, но не освобождается, поэтому после того, как необходимость в выделенной памяти отпадет, ее следует освободить оператором delete [ ] <имя_указателя>, которому присвоено возвращаемое значение.

Замечание 2. Для работы в куче можно также использовать функции:

- void* malloc(размер);

- void* calloc(количество, размер элемента); // Под массив

- void free(указатель); // Возвращенный функцией malloc или calloc

Прототипы этих функций находятся в файле stdlib.h.

Применение операторов new и delete является предпочтительным.