Операции new и delete обеспечивают более удобные средства для реализации динамического распределения памяти (для любых встроенных или определенных пользователем типов) по сравнению с вызовами функций malloc и free в С. Рассмотрим следующее предложение:
TypeName *typeNamePtr;
В Си ANSI, чтобы динамически создать объект типа TypeName, вы должны написать:
typeNamePtr = malloc(sizeof()) ;
Это требует вызова функции malloc и явной ссылки на операцию sizeof. В версии С, предшествующей С ANSI, вы должны были бы также привести тип указателя, возвращенного malloc, операцией приведения типа (TypeName *). Функция malloc не обеспечивает никакого метода инициализации выделяемого блока памяти. В С++ вы просто пишете
typeNamePtr = new TypeName;
Операция new автоматически создает объект соответствующего размера, вызывает конструктор объекта и возвращает указатель правильного типа. Если new не в состоянии найти необходимое пространство в памяти, она возвращает указатель О.
Чтобы освободить пространство, выделенное ранее для этого объекта, в С++ вы должны использовать операцию delete в следующем виде:
delete typeNamePtr;
С++ позволяет вам использовать инициализатор для только что созданного объекта
float *thingPtr = new float (3.14159);
который задает начальное значение вновь созданному объекту типа float, равное 3.14159.
Массив можно создать и присвоить его chessBoardPtr в следующем виде:
int *chessBoardPtr = new int{8}{8};
Этот массив может быть уничтожен с помощью оператора
delete {} chessBoardPtr;
Как мы увидим, использование new и delete вместо malloc и free дает и другие преимущества. В частности, new автоматически активизирует конструктор, a delete автоматически активизирует деструктор класса.
Типичная ошибка программирования 7.8
Смешивание способов динамического распределения памяти в аиле new-delete со стилем malloc-free: пространство, созданное с помощью malloc, не может быть освобождено с помощью delete; объекты, созданные с помощью new, не могут быть уничтожены с помощью free.
Хотя программы на С++ могут поддерживать память, выделяемую с помощью malloc и уничтожаемую с помощью free, и объекты, создаваемые с помощью new и уничтожаемые с помощью delete, лучше использовать только new и delete.
Комментариев нет:
Отправить комментарий