Массивы. Динамическое выделение массивов. Выделение и освобождение памяти. Массивы в качестве параметров функций

Страницы работы

Фрагмент текста работы

является синонимом типа unsigned char, возвращаемого оператором sizeof.

Функция free

Функция освобождения памяти free в качестве единственного аргумента принимает указатель на удаляемый блок объектов (*block) и имеет синтаксис:

void free ( void *block ) ;

Данная функция подключается в заголовочном файле stdlib.h или alloc.h. Тип объектов удаляемого блока может быть произвольным, на что указывает ключевое слово void.

Рассмотрим пример выделения динамической памяти для десяти объектов типа int, заполнение выделенной области числами от нуля до девяти и освобождение ресурса памяти.

#include <iostream.h>

#include <stdlib.h>

#include <windows.h>

int main ( void )

{

int* pReg ;                             // объявление указателя на область памяти

                                                // выделение области памяти

if ( ( pReg = ( int* ) malloc ( 10*sizeof ( int ) ) )==NULL )

{

char S [80] ;                   // преобразование строки

CharToOem ( “\n Heдостаточно памяти \n” , S ) ;          // преобразование строки

cout << S ;                      // вывод на экран сообщения

return 1 ;                      // завершить программу, если не хватает памяти для выделения

}

for ( int i=0 ; i<10 ; i++ ) *( pReg + i ) = i ;                   // заполнение выделенного блока памяти

for ( i=0 ; i<10 ; i++ ) cout << *( pReg + i ) << ' \n ' ;      // вывод значений заполненного блока

free ( pReg ) ;                                                                // освобождение блока памяти

}

Пример динамического выделения памяти под двумерный массив Array[n][m] переменных типа int выглядит следующим образом:

Array = ( int* ) malloc ( n*m*sizeof ( int ) ) ;

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

В отличие от функций работы с динамической памятью malloc, calloc и free, заимствованных в C++ из стандарта ANSI С для совместимости, новые операторы гибкого распределения памяти new и delete обладают дополнительными возможностями, перечисленными ниже.

Ø  Функции malloc и calloc возвращают пустой указатель, который в дальнейшем требуется приводить к заданному типу. Оператор new возвращает указатель на тип, для которого выделялась память, и дополнительных преобразований уже не требуется.

Ø  Операция new предполагает возможность использования совместно с библиотечной функцией set_new_handler, позволяющей пользователю определить свою собственную процедуру обработки ошибки при выделении памяти.

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

Операторы new и delete имеют две формы:

Ø  управление динамическим размещением в памяти единичного объекта;

Ø  динамическое размещение массива объектов.

Синтаксис операторов new и delete при работе с единичными объектами следующий:

тип_объекта *имя = new тип_объекта ;

delete имя ;

При управлении жизненным циклом массива объектов синтаксис операторов new и delete имеет вид:

тип_объекта *имя = new тип_объекта [количество] ;

delete [] имя ;

Здесь параметр количество в операторе new[] характеризует количество объектов типа тип_объекта, для которых производится выделение области памяти. В случае успешного резервирования памяти переменная-указатель имя ссылается на начало выделенной области. При удалении массива его размер указывать не нужно.

Форма оператора delete должна обязательно соответствовать форме оператора new для данного объекта: если выделение памяти проводилось для единичного объекта (new), освобождение памяти также должно осуществляться для единичного объекта (delete). В случае применения оператора new[] (для массива объектов), в конечном итоге высвобождение памяти должно быть произведено с использованием оператора delete[].

Поясним все вышесказанное на примере.

#include <iostream.h>

#include < windows.h>

void main ()

{

const n = 100 ;                                              // размер массива - константа типа int

int* pInt ;                                                      // объявление указателя на переменную типа int

pInt = new int [n] ;                          // выделение памяти для массива из n объектов типа int

for ( int i=0 ; i<n ; i++) *( pInt + i ) = n – i ;    // инициализация массива

Похожие материалы

Информация о работе