Создание и поддержание динамических структур данных требует
динамического распределения памяти: возможности в процессе выполнения программы изменения области памяти для хранения новых узлов и освобождения ресурсов памяти в которых уже нет необходимости.
Пределы динамического выделения памяти ограничены только объемом доступной физической или виртуальной памяти в системах с виртуальной памятью. Операции
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
Пример 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;