Главная страница

Лекции. Основные понятия и определения


Скачать 1.94 Mb.
НазваниеОсновные понятия и определения
Дата27.03.2018
Размер1.94 Mb.
Формат файлаdocx
Имя файлаЛекции.docx
ТипКонтрольные вопросы
#39570
страница44 из 58
1   ...   40   41   42   43   44   45   46   47   ...   58

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=newchar[n];

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

float *ptr, buf;

short i, n;

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

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

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

ptr=new float[n]);

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

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

for(i=0; i

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

}

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

delete [ ] ptr;

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

#include

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

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

char* substr(const 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

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


написать администратору сайта