Лекции. Основные понятия и определения
Скачать 1.94 Mb.
|
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 [] <имя_указателя>, которому присвоено возвращаемое значение. |