
- •1.K&r c. Ansi c и iso c. Стандарт c99
- •Структура компилятора
- •3.Проблемы использования языка Си.
- •5.Числовые константы. Символические константы.
- •6.Идентификаторы. Константные переменные. Основные типы.
- •7.Указатели. Ссылки. Изменение типа данных.
- •8.Одномерные массивы. Символьные массивы.
- •9.Многомерные массивы.
- •10.Структуры.
- •11.Ключевое слово union.
- •12.Переименование типов (typedef).
- •13.Выражения.
- •14.Арифметические операции. Логические операции.
- •15.Операции присвоения.
- •16.Операции отношения. Адресные операции.
- •Адресные операции
- •17.Операции “?:”, sizeof, (тип)
- •18.Составной оператор. Оператор-выражение.
- •19.Условный оператор if. Оператор-переключатель switch. Условный оператор if
- •If (условие) оператор_1; else оператор_2;
- •If (условие) { оператор_1; оператор_2; … }
- •Оператор варианта switch
- •20.Операторы циклов while и do-while.
- •21.Оператор цикла for. Оператор продолжения continue.
- •22.Определение функции. Оператор возврата return. Вызов функции.
- •23.Функция main.
- •24.Поименованные константы и замена идентификаторов. Макросы.
- •If (выражение)
- •25.Включение файлов. Условная компиляция. Включение файла
- •26.Команда error. Команда pragma.
- •27.Обработка особых ситуаций. Обработка try, перехват catch, Спецификация особой ситуации throw.
- •28.Функции-подстановки (inline).
- •29.Операция создания объекта new. Операция delete. Операция new
- •Операция delete
- •30.Инкапсуляция. Наследование.
- •31.Полиморфизм.
- •32.Классы. Члены класса.
- •33.Конструктор. Деструктор. Функции-члены.
- •34.Операция доступа к области видимости “::”. Указатель this.
29.Операция создания объекта new. Операция delete. Операция new
В С++ предлагается другой подход к выделению памяти: операция new. Это - универсальная операция, которая получает память у операционной системы и возвращает указатель на начало выделенного блока. В следующей программе продемонстрировано, как это работает:
1 |
#include |
2 |
#include |
3 |
using namespace std; |
|
4 |
int main ( ) |
|
5 |
{ |
|
6 |
char* str = "Очень длинная строка."; |
7 |
int len = strlen ( str ); // вычисление длины строки |
|
8 |
char* ptr; // определим переменную |
|
9 |
ptr = new char [ len +1 ]; // выделяем память, используя оператор new |
||
10 |
strcpy ( ptr, str ); // копируем str у ptr |
|
11 |
cout<< "ptr = " << ptr << endl; // содержание ptr |
|
12 |
delete [] ptr; // освобождение выделенной памяти, оператор delete |
13 |
return 0; |
|
14 |
} |
|
Выражение
ptr = new char [ len + 1 ]; |
присваивает переменной ptr значение адреса блока памяти, достаточного для сохранения строке str, длину которого можно получить, используя библиотечную функцию strlen(), добавив дополнительный байт для символа окончания строки. Результат работы программы:
ptr = Очень длинная строка. |
Операция delete
Если программа резервирует много участков памяти, используя операцию new, то в конце концов все доступное пространство памяти будет заполнено, а это приведет к сбоям системы. Для того чтобы этого избежать и эффективно использовать память, используется операция delete. Ее назначение — освобождение выделенных участков памяти и возвращение их операционной системе. В примере строка
delete [] ptr; |
возвращает системе память, на которую указывал указатель ptr.
На самом деле в этом случае нам не нужна эта операция, поскольку память автоматически освобождается после завершения программы. Но для более сложных ситуаций (например, использование локальной переменной функции как указатель на память) использование операции необходимо, поэтому освобождение памяти после ее использования, является хорошим тоном, а часто без этого и вовсе не обойтись. Квадратные скобки, следующие за операцией delete, означают, что высвобождается именно массив. Для высвобождения памяти, выделенной для одинарного объекта, использование скобок не требуется.
ptr = new SomeClass; // создание одинарного объекта, оператор new |
|
delete ptr; // скобки не нужны, оператор delete |
|
Однако при высвобождении памяти, которую занимает массив, скобки ставить обязательно. Их наличие означает, что высвобождается память, которая использовалась для всех членов массива одновременно.