Скачиваний:
316
Добавлен:
28.03.2021
Размер:
378.53 Кб
Скачать
  1. Максимизация эффективности использования памяти компьютера.

Для С++-программы существует два основных способа хранения информации в основной памяти компьютера. Первый состоит в использовании переменных. Область памяти, предоставляемая переменным, закрепляется за ними во время компиляции и не может быть изменена при выполнении программы. Второй способ заключается в использовании C++- системы динамического распределения памяти. В этом случае память для данных выделяется по мере необходимости из раздела свободной памяти, который расположен между вашей программой (и ее постоянной областью хранения) и стеком.

Система динамического распределения памяти — это средство получения программой некоторой области памяти во время ее выполнения. Другими словами, благодаря этой системе программа может создавать переменные во время выполнения, причем в нужном (в зависимости от ситуации) количестве. Эта система динамического распределения памяти особенно ценна для таких структур данных, как связные списки и двоичные деревья, которые изменяют свой размер по мере их использования. Динамическое выделение памяти для тех или иных целей — важная составляющая почти всех реальных программ.

10. Динамическое распределение памяти с использованием операторов языка С++ new и delete

Язык C++ содержит два оператора, new и delete, которые выполняют функции по выделению и освобождению памяти.

Оператор new позволяет динамически выделить область памяти.

переменная-указатель = new тип_переменной;

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

delete переменная-указатель;

Здесь элемент переменная-указатель представляет собой указатель на значение, тип которого задан элементом тип_переменной. Оператор new выделяет область памяти, достаточную для хранения значения заданного типа, и возвращает указатель на эту область памяти. С помощью оператора new можно выделить память для значений любого допустимого типа. Оператор delete освобождает область памяти, адресуемую заданным указателем. После освобождения эта память может быть снова выделена в других целях при последующем new-запросе на выделение памяти.

11. Использование new и delete для реализации динамических массивов (одномерных и двумерных). Инициализация динамически выделенной памяти.

Память под массивы можно выделять динамически, т. е. размещать в свободной памяти (free store). Свободная память – это предоставляемая системой область памяти для объектов, время жизни которых устанавливается программистом. В С++ для операций выделения и освобождения памяти используются встроенные операторы new и delete.

В простейшем виде оператор new можно записать следующим образом:

new имя_типа;

new имя_типа(выражение);

new имя_типа[выражение];

Оператор new выделяет надлежащий объем свободной памяти для хранения указанного типа и возвращает базовый адрес объекта. Когда память недоступна, оператор new возвращает NULL либо возбуждает соответствующее исключение.

Можно динамически выделить память под двумерный массив, используя «указатель на указатель». В языке С++ допустимо объявлять переменные, имеющие тип «указатель на указатель». Объявляется «указатель на указатель» следующим образом:

int **mas;

Фактически «указатель на указатель» – это адрес ячейки памяти, хранящей адрес указателя.

Оператор delete уничтожает объект, созданный с помощью new.

delete переменная_указатель // для указателя на один элемент

delete [] переменная_указатель // для указателя на массив

Первая форма используется, если соответствующее выражение new размещало не массив. Во второй форме присутствуют пустые квадратные скобки, показывающие, что изначально размещался массив объектов. Оператор delete не возвращает значения.

Используя оператор new, динамически выделяемую память можно инициализировать. Для этого после имени типа надо задать начальное значение, заключив его в круглые скобки.

int main() {

int *p;

p = new int (99); // Инициализируем память числом 99.

cout << *p; // На экран выводится число 99.

delete p;

return 0;

}

// объявление двумерного динамического массива на 10 элементов:

float **ptrarray = new float* [2]; // две строки в массиве

for (int count = 0; count < 2; count++)

ptrarray[count] = new float [5]; // и пять столбцов

// где ptrarray – массив указателей на выделенный участок памяти под массив вещественных чисел типа float

// высвобождение памяти отводимой под двумерный динамический массив:

for (int count = 0; count < 2; count++)

delete [] ptrarray[count];

// где 2 – количество строк в массиве