Что такое findslide.org?

FindSlide.org - это сайт презентаций, докладов, шаблонов в формате PowerPoint.


Для правообладателей

Обратная связь

Email: Нажмите что бы посмотреть 

Яндекс.Метрика

Презентация на тему Динамические структуры данных

Содержание

Динамическая память и динамические переменныеСтатическая память выделяется до начала работы программы под глобальные переменные (до main()) или статические переменные (static) и освобождается только при завершении программы. Cтатическая память инициализируется случайными значениями. Поскольку область статической памяти выделяется
Динамические структуры данныхСтруктура памяти программыДинамическая память и динамические переменные.Динамические массивы.Функции управления памятью. Динамическая память и динамические переменныеСтатическая память выделяется до начала работы программы под Динамическое выделение и освобождение памятиДинамическая память должна быть связана с некоторым указателем, Операторы New и DeleteДинамическое распределением памяти (dynamic allocation) памяти происходит с помощью Динамические массивы в С++Можно выделять сразу несколько ячеек динамической памяти, получая динамический Двумерный динамический массив	// объявление двумерного динамического массива из 10 элементов	float **ptrarray = new “Потеря” памятиЕсли в указатель, уже хранящий адрес какого-то фрагмента динамической памяти, записать Функции управления памятьюПрименяются там, где требуется более гибкое управление памятью, чем с malloc()malloc() – предназначена для выделения непрерывной области памяти заданного размера: 	void * malloc(int size); // выделить calloc()calloc() – предназначена для выделения памяти под заданное количество блоков:	void * calloc(int n, int size); realloc()realloc() – предназначена для изменения размера динамически выделенной области:		void* realloc( void* ptr, int free()free() – предназначена для освобождения памяти, выделенной функциями malloc(),calloc(),realloc():	void free(void *ptr); //ptr - указатель РекомендацииФункции malloc/free/realloc представляют собой библиотеку «классического» Си и транслятором не контролируются. С их помощью Пример// Строка как динамический массив - объединение строкchar  *twoToOne(char *p1, char *p2){                 char  *out; int   n1,n2;for (n1=0; Задачи3. Реализуйте программу: Пользователь вводит строку цифр с клавиатуры (максимальная длина строки
Слайды презентации

Слайд 2 Динамическая память и динамические переменные

Статическая память выделяется до

Динамическая память и динамические переменныеСтатическая память выделяется до начала работы программы

начала работы программы под глобальные переменные (до main()) или

статические переменные (static) и освобождается только при завершении программы. Cтатическая память инициализируется случайными значениями. Поскольку область статической памяти выделяется заранее (в момент начала работы программы), она имеет фиксированный размер, что не всегда удобно и оправдано (например, массивы фиксированной длины).

Динамическая память (куча- Heap), выделяется явно по запросу программы из ресурсов операционной системы и контролируется указателем. По окончании работы программы, вся затребованная программой динамическая память возвращается ОС.

Особенности динамической памяти:
она не инициализируется автоматически и должна быть явно освобождена;
в отличие от статической памяти динамическая память практически не ограничена (только размером оперативной памяти) и может динамически меняться в процессе работы программы;
поскольку она контролируется указателем, доступ к ней осуществляется несколько дольше, чем для статической памяти;
программист сам должен заботиться о выделении и освобождении памяти, что чревато большим количеством потенциальных ошибок.




Слайд 3 Динамическое выделение и освобождение памяти
Динамическая память должна быть

Динамическое выделение и освобождение памятиДинамическая память должна быть связана с некоторым

связана с некоторым указателем, подходящего типа

int* p; p = new

int; *p = 10; cout << *p; // 10 delete p; // память освобождена

Если не освобождать динамическую память, то она будет занята до завершения программы, что неприемлемо.

При создании одной динамической переменной можно сразу инициализировать её значение:

int* p; p = new int(10); cout << *p; // 10 delete p; // память освобождена

Динамической переменной называется переменная, память для которой выделяется во время работы программы с помощью оператора New.


Слайд 4 Операторы New и Delete
Динамическое распределением памяти (dynamic allocation)

Операторы New и DeleteДинамическое распределением памяти (dynamic allocation) памяти происходит с

памяти происходит с помощью оператора new , который выделяет

новую ячейку памяти для переменной, и возвращает указатель на нее:




7




7

1.

2.

3.

4.

5.

6.


Слайд 5 Динамические массивы в С++

Можно выделять сразу несколько ячеек

Динамические массивы в С++Можно выделять сразу несколько ячеек динамической памяти, получая

динамической памяти, получая динамический массив. Для этого его размер

указывается в квадратных скобках после типа int [n]. Чтобы удалить динамический массив и освободить память используется оператор delete[].
int* p; p = new int [12]; for (int i=0; i<12; i++) {   *(p+i) = i + 1;     cout << *(p+i) << ' '; // 1 2 3 ... 12 } delete [] p; // память освобождена

Cразу после создания динамический массив автоматически заполняется нулями.


Слайд 6 Двумерный динамический массив
// объявление двумерного динамического массива из

Двумерный динамический массив	// объявление двумерного динамического массива из 10 элементов	float **ptrarray

10 элементов
float **ptrarray = new float* [2];  // две строки в

массиве
    for (int count = 0; count < 2; count++)
        ptrarray[count] = new float [5];  // и пять столбцов

float **ptrarray - указатель второго  порядка , который ссылается на массив указателей  float* [2]

// освобождение памяти, отводимой под двумерный дин. массив
     for (int count = 0; count < 2; count++)
         delete [] ptrarray[count];
//      где 2 – количество строк в массиве

Объявление и удаление двумерного динамического массива выполняется с помощью цикла.


Слайд 7 “Потеря” памяти

Если в указатель, уже хранящий адрес какого-то

“Потеря” памятиЕсли в указатель, уже хранящий адрес какого-то фрагмента динамической памяти,

фрагмента динамической памяти, записать новый адрес, то фрагмент динамической

памяти будет потерян
int* p; p = new int(12); int a = 777; p = &a; // теперь до 12 никак не добраться

Проблема становится особенно острой, когда в памяти теряются целые массивы (они занимают больше места, чем отдельные переменные).
int* p; for (int i=1; i<=10; i++) {     p = new int[100]; } delete[] p;
Всего массивов будет создано 10, но только от последнего из них память будет освобождена после выхода из цикла.
9 массивов * 100 элементов * 4 байта = 3600 байт потерянной памяти,

Важно вовремя освобождать занятую память!


Слайд 8
Функции управления памятью
Применяются там, где требуется более гибкое

Функции управления памятьюПрименяются там, где требуется более гибкое управление памятью, чем

управление памятью, чем с помощью New и Delete, которые

работают с блоками памяти, соответствующими типам указателей.

Слайд 9 malloc()
malloc() – предназначена для выделения непрерывной области памяти заданного

malloc()malloc() – предназначена для выделения непрерывной области памяти заданного размера: 	void * malloc(int size); //

размера: 

void * malloc(int size); // выделить область памяти размером
                    // в

size байтов и возвратить адрес

#include
int *intarray; /* захватываем пространство для 20 целых */ intarray = (int*) malloc(20*sizeof(int));

Функция malloc() возвращает указатель без типа.
Если выделить память не удалось, функция возвращает значение NULL.


Слайд 10 calloc()
calloc() – предназначена для выделения памяти под заданное количество

calloc()calloc() – предназначена для выделения памяти под заданное количество блоков:	void * calloc(int n, int

блоков:
void * calloc(int n, int size); // n - количество блоков

// size – размер каждого блока в байтах

#include
lalloc = (long*) calloc(40, sizeof(long));

Возвращает указатель на первый байт выделенной области памяти.
Если выделить память не удалось, функция возвращает значение NULL.


Слайд 11 realloc()
realloc() – предназначена для изменения размера динамически выделенной области:
void*

realloc()realloc() – предназначена для изменения размера динамически выделенной области:		void* realloc( void* ptr,

realloc( void* ptr, int size);
// ptr – указатель на первоначальную

область памяти
// size – новый размер области памяти.

#include
har *realloc(ptr,size);


Слайд 12 free()
free() – предназначена для освобождения памяти, выделенной функциями malloc(),calloc(),realloc():

void free(void

free()free() – предназначена для освобождения памяти, выделенной функциями malloc(),calloc(),realloc():	void free(void *ptr); //ptr -

*ptr); //ptr - указатель на захваченный блок памяти

char

*alloc; /* захватывает 100 байтов и освобождает их */ if ((alloc=malloc(100))==NULL /* проверяет на правильность указателя */ printf("unable to allocate memory\n"); else { . . free(alloc); /* освобождает память для heap */ }

Слайд 13 Рекомендации
Функции malloc/free/realloc представляют собой библиотеку «классического» Си и транслятором не

РекомендацииФункции malloc/free/realloc представляют собой библиотеку «классического» Си и транслятором не контролируются. С их

контролируются.
С их помощью можно работать с обычными переменными

и их массивами, но никак не с объектами.

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

Отсюда рекомендации:
   не применять для динамической переменной или динамического массива одновременно функции и операции управления динамической памятью;
   при работе с объектами использовать только операции  new/delete;
   при освобождении памяти из-под динамического массива «подсказывать» транслятору, что указатель ссылается именно на массив, записывая перед указателем пустые скобки: delete [] pd1.

Слайд 14 Пример
// Строка как динамический массив - объединение строк

char  *twoToOne(char

Пример// Строка как динамический массив - объединение строкchar  *twoToOne(char *p1, char *p2){                 char  *out; int   n1,n2;for

*p1, char *p2){                 
char  *out; int   n1,n2;
for (n1=0; p1[n1]!='\0'; n1++);            // длина первой строки
for

(n2=0; p2[n2]!='\0'; n2++);            // длина второй строки
if ((out = new char [n1+n2+1]) == NULL)
      return NULL;                             // выделить память под результат
for (n1=0; *p1!='\0';)  out[n1++] = *p1++;
while(*p2!=0) out[n1++] = *p2++;      // копировать строки
out[n1] = '\0';
return out;
}

  • Имя файла: dinamicheskie-struktury-dannyh.pptx
  • Количество просмотров: 164
  • Количество скачиваний: 0
- Предыдущая Клиенты B2С