4869

Указатели и массивы. Способы распределения памяти. Динамическое распределение памяти. Операции new и delete

Лекция

Информатика, кибернетика и программирование

Указатели и массивы. Способы распределения памяти. Динамическое распределение памяти. Операции new и delete. Динамические массивы. Как уже было сказано ранее, массивы представляют собой последовательно размещенную в памяти последовательность перемен...

Русский

2012-11-28

37.5 KB

19 чел.

Указатели и массивы. Способы распределения памяти. Динамическое распределение памяти. Операции new и delete. Динамические массивы.

Как уже было сказано ранее, массивы представляют собой последовательно размещенную в памяти последовательность переменных одного типа. В С++ имя массива связано с адресом, по которому в памяти находится первый элемент массива, т.е. по сути, является указателем на первый элемент массива. Используя правила адресной арифметики, можно работать с элементами массива без применения оператора индексации []:

int A[5]; // Массив из 5 элементов

 // Адрес A эквивалентен &A[0]

*( A + 2 ) = 10; // эквивалентно A[2] = 10;

 

 // Обход элементов массива с использованием адресной арифметики

 for ( int i = 0; i < 5; ++i )

 *( A + i ) = i;

С++ позволяет работать с несколькими видами памяти.

Глобальная или статическая память выделяется в момент загрузки программы в оперативную память (до вызова функции main), а её размер полностью определяется на этапе компиляции. В статической памяти размещаются переменные, объявленные в глобальном контексте (вне каких-либо блоков), а также статические переменные.

int i = 10;  // Глобальная переменная

double D[10]; // Глобальный массив

int main()

{

    ...

}

Автоматическая память — это специальный регион памяти, резервируемый при запуске программы до вызова функции main из свободной оперативной памяти и используемый в дальнейшем для размещения локальных объектов: объектов, определяемых в теле функций и получаемых функциями через параметры в момент вызова. Автоматическую память часто называют стеком. Управление автоматической памятью осуществляется компилятором – он «автоматически» выделяет память под локальные объекты при их создании и освобождает память при их разрушении.

int main()

{

 double d = 5; // Переменная в автоматической памяти

 int A[5];     // Массив в автоматической памяти

}

Динамическая память – это совокупность блоков памяти, выделяемых из доступной свободной оперативной памяти непосредственно во время выполнения программы под размещение конкретных объектов. Доступную программе свободную память называют кучей (heap). Управление динамической памятью осуществляется явным образом с помощью операторов new (выделение памяти) и delete (освобождение памяти). Обращение к памяти возможно через указатель на соответствующий участок.

double * d = new double(5.5); // Выделение памяти под одиночную

// переменную с одновременной

// инициализацией

 float * f = new float[10];    // Выделение памяти под массив

 delete d;    // Освобождение памяти, занимаемой

   // одиночной переменной

 delete [] f; // Освобождение памяти, занимаемой массивом

Использование динамической памяти становится необходимым в случаях, когда размер нужной памяти слишком велик для размещения в стеке (т.к. размер стека существенно ограничен), либо заранее неизвестен, например, когда в памяти необходимо разместить данные, поступающие из «внешнего» источника (ввод с клавиатуры, из файла, сетевого соединения и т.п.). В качестве примера, иллюстрирующего сказанное, можно рассмотреть задачу сохранения в массив последовательности чисел, вводимых с клавиатуры. Количество чисел заранее неизвестно.

#include <iostream>

int main()

{

 // Начальный размер резервируемой памяти

 const int INITIAL_SIZE = 10;

 // Прирост памяти при переполнении

 const int SIZE_INCREMENT = 10;

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

 double * D = new double [ INITIAL_SIZE ];

 // Текущее количество записанных элементов в массиве

 int currentLength = 0;

 // Текущий размер выделенной памяти

 int maxSize = INITIAL_SIZE;    

 // "Рабочая" переменная

 double tmp;

 

 while( std::cin >> tmp )  // Читаем очередное число

{

 // В массиве кончилось место

 if ( currentLength == maxSize )

 {

  // Увеличиваем необходимый размер памяти

  maxSize += SIZE_INCREMENT;

  // Запоминаем указатель на текущую память

  double * oldD = D;

  // Выделяем новую память (большего размера)

  D = new double[ maxSize ];  

  // Копируем содержимое "старой" памяти в "новую"

  for ( int i = 0; i < currentLength; ++i )

   D[ i ] = oldD[i];

  // Освобождаем "старую" память

  delete [] oldD;

 }

 // Записываем очередной элемент в массив

 D[ currentLength++ ] = tmp;

}

 // Вывод всех элементов массива

 std::cout << "Total elements: " << currentLength << std::endl;

 for ( int i = 0; i < currentLength; ++i )

 std::cout << D[ i ] << " ";

std::cout << std::endl;

 system( "pause" );

 return 0;

}


 

А также другие работы, которые могут Вас заинтересовать

65243. Розробка системи паливоподачі з електронним керуванням автотракторного дизеля з лінійним п’єзоелектричним перетворювачем 1.16 MB
  Таким чином розробка конструкції виконавчого елемента форсунки перспективної паливної акумуляторної апаратури вітчизняного виробництва вибір її оптимальних параметрів і розробка методики адаптації такої системи до двигуна є актуальним завданням яке визначило напрямок даного дисертаційного дослідження.
65244. Засоби контролю виробів електронної техніки за рівнем низькочастотного шуму 1.03 MB
  В теперішній час спостерігається значний розвиток електронних компонентів. Елементна база постійно вдосконалюється і, як свідчить практика, технологічні процеси виготовлення не є ідеальними.
65245. Інформаційна технологія створення графічних засобів захисту документів з використанням стеганографічних методів 651 KB
  Необхідність захисту документів та цінних паперів виникає на всіх етапах їх використання. Тому документи орієнтовані на використання при обслуговуванні різних технологічних процесів потребують різних рівнів захисту.
65246. АГРОКЛІМАТИЧНА ОЦІНКА ФОРМУВАННЯ ПРОДУКТИВНОСТІ ВИНОГРАДУ 261 KB
  При оцінці теплових ресурсів особливо велике значення має добова ритміка температур впродовж періоду вегетації На сьогоднішній день відомо багато фундаментальних та прикладних досліджень які були направлені на детальний аналіз кількісного характеру впливу термічного режиму на виноград.
65247. Диференційований підхід до призначення небіологічних базисних препаратів хворим з різною тривалістю ревматоїдного артриту 253 KB
  В Україні зареєстровано близько 170000 хворих на РА захворюваність серед жінок складає 0204 а серед чоловіків 0102 випадки на 1000 населення в рік Коваленко В. Майже 90 пацієнтів з агресивною формою хвороби стають непрацездатними в межах 20 років та складають...
65248. Побудова мереж супутникового телебачення високої чіткості у країнах з обмеженим частотно-орбітальним ресурсом 548 KB
  Наукові розробки в області ТБВЧ і супутникового мовлення проводять цілу низка вчених різних країн: М. В найближчому майбутньому можна очікувати що Європа почне впроваджувати мультипрограмне супутникове цифрове ТВ мовлення високої чіткості для якого ймовірно...
65249. Математичні та комп’ютерні моделі в квантовій інформатиці 426 KB
  Особливістю квантових систем є так званий квантовий паралелізм що є наслідком принципу суперпозиції станів квантової системи і що дозволяє експоненціально зменшити необхідні для вирішення задачі обчислювальні ресурси.
65250. Розвиток наукових основ удосконалення технології доменної плавки з використанням стаціонарних систем контролю поверхні засипу шихти 401 KB
  Нині функції профілемірів обмежені контролем поверхні засипу шихти в доменній печі. Через малодоступність для експериментальної перевірки фізикохімічних процесів відновлення плавлення й інших перетворень залізорудних матеріалів флюсів і горючих вуглецевмісних матеріалів що протікають...
65251. Розвиток методу розрахунку параметрів процесу холодної періодичної роликової прокатки з регулюванням довжини куліси для збільшення виходу придатного особливотонкостінних труб 182.5 KB
  Холодна періодична роликова прокатка труб ХПТР застосовується в основному для виробництва високоякісних особливотонкостінних труб які використовуються в атомній енергетиці авіації приладобудуванні суднобудуванні тощо.