Создание и поддержание динамических структур данных требует динамического распределения памяти: возможности в процессе выполнения программы изменения области памяти для хранения новых узлов и освобождения ресурсов памяти в которых уже нет необходимости.
Пределы динамического выделения памяти ограничены только объемом доступной физической или виртуальной памяти в системах с виртуальной памятью. Операции new и delete – основные для работы с динамической памятью. Операция new принимает в качестве аргумента тип динамического размещения объекта и возвращает указатель на объект этого типа.
Пример 1
Node *newptr = new Node[10];
// выделяет в памяти sizeof(Node) байтов и сохраняет указатель на область памяти указателем Ptr. Число 10 – число размещенных объектов данных.
Пример 2
main()
{
 int* p = new int;
 cout << "sizeof(int) = " << sizeof(int) "\n";
}
Для освобождения памяти используется оператор delete. Указатель newptr не удаляется, а исчезает область памяти, на которую указывает newptr.
Пример 3
delete[] newptr;
Пример 4
main() {
 char *p = new char[100];
 char *q = new char[100];
 delete p;
 delete q;
}
Типичные ошибки:
-может быть ссылка на область памяти, которая уже была освобождена
-оператором delete освобождать память, которая не была выделена new
-не осуществляется возвращение динамически выделенной памяти, когда эта память уже не требуется. Это может явиться причиной переполнения памяти (утечка памяти)
-предположение о том, что размер объекта класса является простой суммой объектов его элементов данных. Это не так по причине различных машинно-зависимых требований по выравниванию границ области памяти.
-необходимо проверять, не вернула функция new нулевой указатель
Пример 5
/* распределить память под 1-мерный массив указателей на беззнаковые целые размером degree 
   по адресу tab используя оператор new */

tab=new unsigned *(degree); 

/* под каждый указатель полученного массива указателей распределить одномерный массив беззнаковых 
   целых из degree элементов, используя оператор new в цикле */

for (int i=0; i<degree;i++) 
tab[i]=new unsigned(degree);

/* освободить память, распределенную под degree одномерных массивов беззнаковых целых (из degree элементов каждый)
   по адресам от tab[0] до tab[degree-1] */

for (int i=0; i<degree; i++) 
delete [degree](tab[i]);

/* освободить память, распределенную под 1-мерный массив указателей на беззнаковые целые, 
   состоящий из degree указателей по адресу tab */

delete [degree]tab;