АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Операции new и delete

Читайте также:
  1. I. Психологические операции в современной войне.
  2. Активные операции коммерческих банков: понятие, значение, характеристика видов
  3. Арифметические выражения и операции
  4. Арифметические операции
  5. Арифметические операции и выражения
  6. Арифметические операции над двоично-десятичными числами
  7. Арифметические операции языка С
  8. Б. Операции на рынке иностранной валюты
  9. Банковская система. Банки и их операции.
  10. БАНКОВСКИЕ ОПЕРАЦИИ
  11. Булевы операции
  12. Булевы операции

Мы рассмотрели много примеров, в которых массивы использовались без учета
размера памяти. В строке

int arr1 [ 100 ];

зарезервирована память для 100 элементов типа int. Массивы являются разум-
ным подходом к хранению данных, но они имеют серьезный недостаток: мы
должны знать при написании программы, насколько большой массив нам нужен.
Мы не можем ждать, пока программа запустится и определит размер массива.
Следующий подход работать не будет:

cin >> size; // получим желаемый размер массива

int arr [ size ]; // ошибка, размер массива должен быть константой!

Компилятор требует, чтобы значение размерности массива было константой. Но во многих ситуациях нам неизвестно требуемое количество памяти до запуска программы. Например, нам нужно будет сохранить строку, которую напечатает пользователь программы. В этой ситуации мы можем определить размер массива большим, но это может привести к перерасходу памяти.

Операция new

С++ предлагает другой подход к выделению памяти: операцию new: Это универ-
сальная операция, получающая память у операционной системы и возвраща-
ющая указатель на начало выделенного блока. В программе NEWINTRO показано,
как это работает:

// newintro.cpp

// познакомимся с оператором new

#include <iostream>

#include <cstring>

using namespace std;

 

int main ()

{

char* str = "Дурная голова ногам покоя не дает.";

int len = strlen (str); // вычислим длину нашей строки

char* ptr; // определим переменную

ptr = new char [ len +1 ]; // выделим память

strcpy (ptr, str); // скопируем строку str в ptr

cout << "ptr = " << ptr << endl; // покажем что содержится в ptr

delete [] ptr; // освободим выделенную память

return 0;

}

Выражение

ptr = new char [ len + 1 ];

присваивает переменной ptr значение адреса блока памяти, достаточного для хранения строки str, длину которой можно получить, используя библиотечную функцию strlen() плюс дополнительный байт для символа конца строки. На рис. 10.13 показан синтаксис операции new. Обратите внимание на использование квадратных скобок. На рис. показана память, выделенная с помощью операцииnew, и указатель на нее.

В примере NEWINTRO мы использовали функцию strcpy() для копирования строки str в выделенный участок памяти, на который указывает указатель ptr. Строка полностью займет этот участок памяти, так как его размер равен длине строки str. Результат работы программы NEWINTRO будет следующим:

ptr - Дурная голова ногам покоя не дает.

Программисты, использующие C, говорят, что оператор new играет роль, похожую на роль семейства функций malloc() библиотеки функций. Преимущество операции new в том, что он сразу возвращает указатель на соответствующий тип данных, в то время как указатель функции malloc() должен быть явно преобразован к соответствующему типу.

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

Операция delete

Если ваша программа резервирует много участков памяти, используя операцию new, то в конце концов все возможное пространство памяти будет занято и система рухнет. Для того чтобы избежать этого и эффективно использовать память, используется операция delete. Она предназначена для освобождения выделенных участков памяти, возвращая их операционной системе. В примере NEWINTRO строка

delete [ ] ptr;

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

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

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

ptr = new SomeClass; // создаем один объект

delete ptr; // скобок не требуется

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

 


1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 |

Поиск по сайту:



Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.003 сек.)