Операция new и delete в С++


В С++ появились операции выделения динамической памяти и удаления
(освобождения) динамической памяти.
Операции new и delete выполняют динамическое распределение и отмену распределения памяти, аналогично, но с более высоким приоритетом, нежели стандартные библиотечные функции семейства malloc и free.
Упрощенный синтаксис:
указатель-имени = new имя <инициализатор-имени>;

delete указатель-имени;
Имя может быть любого типа.
new пытается создать объект с типом «имени», распределив (при возможности) sizeof(имя) байт в свободной области памяти (которую также называют «кучей»). Продолжительность существования в памяти данного объекта — от точки его создания и до тех пор, пока операция delete не отменит распределенную для него память, либо до конца работы прог-раммы.
В случае успешного завершения new возвращает указатель нового объекта. Пустой указатель означает неудачное завершение операции (например, недостаточный объем или слишком большая фрагментированность кучи). Как и в случае malloc, прежде чем пытаться обращаться к новому объекту, следует проверить указатель на наличие пустого значения. Возвращаемый указатель будет иметь правильный тип, «указатель имени», без необходимости явного приведения типов.

name *nameptr // name может иметь любой тип,
//кроме функции

if (!(nameptr = new name)) {
errmsg(«Недостаточно памяти для name»);
exit (1);
}
// использование *nameptr для инициализации объекта
//new name

delete nameptr; //удаление name и отмена выделения
//sizeof(name) байтов памяти
new, будучи ключевым словом, не нуждается в прототипе.

Операция new с массивами

Если «имя» это массив, то возвращаемый new указатель указывает на первый элемент массива. При создании с помощью new многомерных массивов следует указывать все размерности массива:

mat_ptr = new int[3][10][12]; // так можно
mat_ptr = new int[3][][12]; // нельзя

delete [] mat_ptr; //освободить память, занятую массивом, на
//который указывает mat_ptr

Инициализаторы с операцией new

Другим преимуществом операции new по сравнению с malloc является возможность инициализации. При отсутствии явных инициализаторов объект, создаваемый new, содержит непредсказуемые данные («мусор»). Объекты, распределяемые new, за исключением массивов, могут инициализироваться соответствующим выражением в скобках:
int_ptr = new int(3);
Для очистки выделенной памяти операцией new можно использовать функцию memset(), объявленную в <mem.h>. Ей передаются 3 параметра: адрес очищаемой памяти, символ для очистки, количество байт.

#include <string.h>
#include <stdio.h>
#include <mem.h>
int main(void) {
char buffer[] = «Hello world\n»;
printf(«Buffer before memset: %s\n», buffer);
memset(buffer, ‘*’, strlen(buffer) — 1);
printf(«Buffer after memset: %s\n», buffer);
return 0;
}

Загрузка...