Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции по технологиям программирования.pdf
Скачиваний:
53
Добавлен:
02.06.2015
Размер:
4.73 Mб
Скачать

Еще один пример с указателями

pppi = new int **; ppi = new int *; pi = new int ; *pppi=ppi;

*ppi=pi; // ppi=π утечкапамяти

***pppi=5;

cout << "*pi=" << *pi << "\n"; delete pppi; delete ppi; delete pi;

Результат:

*pi=5

0x12ff88

0x12ff80

0x12ff78

0x12ff70

i // int

j // int

pi // int *

0x8f5dc8

pj // int *

ppi // int **

0x8f5db8

ppj // int **

pppi // int ***

0x8f5da8

pppj // int ***

HEAP

new int

0x8f5dc8 5

*pi

new int *

0x8f5db8 0x8f5dc8

*ppi new int**

0x8f5da8 0x8f5db8

*pppi

**pppi ***pppi **ppi

Демонстрация работы с динамической памятью через функции new и delete на примере выделения памяти под динамический двумерный массив целых чисел.

#include <malloc.h> #include <iostream>

void out(int** mas); // вывод массивана экран

void clear_mem(int** mas); // очистка intn=2; // числострок

intm=3; // числостолбцов int main()

{

int**d; inti,j;

d = newint* [n]; // выделяем память под //указатели настроки

for ( i=0; i<n; i++) // выделяемпамять под

//указатели настолбцы d[i]=new int[m];

// инициализациямассива for ( i=0; i<n; i++)

for ( j=0; j<m; j++) {d[i][j]=i+j;} out(d); clear_mem(d);

return 0;

}

void out (int **d)

{

for (inti = 0; i < n; i++)

{ for (intj = 0; j < m; j++) std:: cout<< d[i][j] << " "; std::cout << "\n";}

}

void clear_mem(int **d)

{

for (inti = 0; i < n; i++) delete[] d[i]; // освобождаются

//столбцы delete[] d; // освобождаются

//указатели настроки

}

Алгоритмы для управления областями памяти

1.для объектов одного типа: менеджер объектов или stab-аллокатор.

2.для объектов одного размера: битовые маски или алгоритм "близнецов".

3.для объектов произвольного размера и типа метод граничныхмаркеров.

Менеджеробъектов

Список свободных объектов

O[n]

O[2]

O[0][1]

O[0]

Область памяти

Алгоритм битовоймаски

0

 

1

ХХХХХХХХХХХХ

10

ХХХХХХХХХХХХХ

0

 

0

 

1

ХХХХХХХХХХХХ

0

 

Метод граничных маркеров

Структура элемента памяти

Флаг

Размер

 

Следу

Преды

Элемент памяти

 

 

 

Конец

занятости

блока

 

ющий

дущий

 

 

 

 

блока

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0xfffff

 

 

 

 

 

 

 

 

 

 

 

 

1

 

0х000f

 

0xffff0

 

 

 

Элемент памяти

end

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0 0х0ff0

0xfffff

Элемент памяти

end

0xff000