Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
С и С++.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
212.63 Кб
Скачать

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

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