SlideShare a Scribd company logo
1 of 8
Download to read offline
Программирование на языке C++
Лекция 2
Динамическая память
Александр Смаль
1/8
Зачем нужна динамическая память?
∙ Стек программы ограничен. Он не предназначен для
хранения больших объемов данных.
// Не умещается на стек
double m[10000000] = {}; // 80 Mb
∙ Время жизни локальных переменных ограничено временем
работы функции.
∙ Динамическая память выделяется в сегменте данных.
∙ Структура, отвечающая за выделение дополнительной
памяти, называется кучей (не нужно путать с
одноимённой структурой данных).
∙ Выделение и освобождение памяти управляется вручную.
2/8
Выделение памяти в стиле C
∙ Стандартная библиотека cstdlib предоставляет четыре
функции для управления памятью:
void * malloc (size_t size );
void free (void * ptr);
void * calloc (size_t nmemb , size_t size );
void * realloc(void * ptr , size_t size );
∙ size_t — специальный целочисленный беззнаковый тип,
может вместить в себя размер любого типа в байтах.
∙ Тип size_t используется для указания размеров типов
данных, для индексации массивов и пр.
∙ void * — это указатель на нетипизированную память
(раньше для этого использовалось char *).
3/8
Выделение памяти в стиле C
∙ Функции для управления памятью в стиле C:
void * malloc (size_t size );
void * calloc (size_t nmemb , size_t size );
void * realloc(void * ptr , size_t size );
void free (void * ptr);
∙ malloc — выделяет область памяти размера ≥ size.
Данные не инициализируются.
∙ calloc — выделяет массив из nmemb размера size.
Данные инициализируются нулём.
∙ realloc — изменяет размер области памяти по указателю
ptr на size (если возможно, то это делается на месте).
∙ free — освобождает область памяти, ранее выделенную
одной из функций malloc/calloc/realloc. 4/8
Выделение памяти в стиле C
∙ Для указания размера типа используется оператор sizeof.
// создание массива из 1000 int
int * m = (int *) malloc (1000 * sizeof(int ));
m[10] = 10;
// изменение размера массива до 2000
m = (int *) realloc(m, 2000 * sizeof(int ));
// освобождение массива
free(m);
// создание массива нулей
m = (int *) calloc (3000 , sizeof(int ));
free(m);
m = 0; 5/8
Выделение памяти в стиле C++
∙ Язык C++ предоставляет два набора операторов для
выделения памяти:
1. new и delete — для одиночных значений,
2. new [] и delete [] — для массивов.
∙ Версия оператора delete должна соответствовать версии
оператора new.
// выделение памяти под один int со значением 5
int * m = new int (5);
delete m; // освобождение памяти
// создание массива значений типа int
m = new int [1000];
delete [] m; // освобождение памяти
6/8
Типичные проблемы при работе с памятью
∙ Проблемы производительности: создание переменной на
стеке намного “дешевле” выделения для неё динамической
памяти.
∙ Проблема фрагментации: выделение большого количества
небольших сегментов способствует фрагментации памяти.
∙ Утечки памяти:
// создание массива из 1000 int
int * m = new int [1000];
// создание массива из 2000 int
m = new int [2000]; // утечка памяти
// Не вызван delete [] m, утечка памяти
7/8
Типичные проблемы при работе с памятью
∙ Неправильное освобождение памяти.
int * m1 = new int [1000];
delete m1; // должно быть delete [] m1
int * p = new int (0);
free(p); // совмещение функций C++ и C
int * q1 = (int *) malloc(sizeof(int ));
free(q1);
free(q1); // двойное удаление
int * q2 = (int *) malloc(sizeof(int ));
free(q2);
q2 = 0; // обнуляем указатель
free(q2); // правильно работает для q2 = 0
8/8

More Related Content

What's hot

6.2 Шаблоны функций
6.2 Шаблоны функций6.2 Шаблоны функций
6.2 Шаблоны функцийDEVTYPE
 
Программирование. Лекция 3
Программирование. Лекция 3Программирование. Лекция 3
Программирование. Лекция 3Andrei V, Zhuravlev
 
3.3 Конструкторы и деструкторы
3.3 Конструкторы и деструкторы3.3 Конструкторы и деструкторы
3.3 Конструкторы и деструкторыDEVTYPE
 
5.5 Ключевое слово friend
5.5 Ключевое слово friend5.5 Ключевое слово friend
5.5 Ключевое слово friendDEVTYPE
 
4.2 Перегрузка
4.2 Перегрузка4.2 Перегрузка
4.2 ПерегрузкаDEVTYPE
 
4.4 Таблица виртуальных методов
4.4 Таблица виртуальных методов4.4 Таблица виртуальных методов
4.4 Таблица виртуальных методовDEVTYPE
 
2.2 Стек вызовов
2.2 Стек вызовов2.2 Стек вызовов
2.2 Стек вызововDEVTYPE
 
3.1 Структуры
3.1 Структуры3.1 Структуры
3.1 СтруктурыDEVTYPE
 
4.3 Виртуальные методы
4.3 Виртуальные методы4.3 Виртуальные методы
4.3 Виртуальные методыDEVTYPE
 
Proizvodnaya i grafiki_funkcii
Proizvodnaya i grafiki_funkciiProizvodnaya i grafiki_funkcii
Proizvodnaya i grafiki_funkciiDimon4
 
Matlab: Построение графика функции
Matlab: Построение графика функцииMatlab: Построение графика функции
Matlab: Построение графика функцииDmitry Bulgakov
 
контрольная работа Variant i
контрольная работа Variant iконтрольная работа Variant i
контрольная работа Variant ileshiy_AlisA
 
5.4 Ключевые слова static и inline
5.4 Ключевые слова static и inline5.4 Ключевые слова static и inline
5.4 Ключевые слова static и inlineDEVTYPE
 
практика 12
практика 12практика 12
практика 12student_kai
 
Matlab: Построение графика и решение уравнения
Matlab: Построение графика и решение уравненияMatlab: Построение графика и решение уравнения
Matlab: Построение графика и решение уравненияDmitry Bulgakov
 
лабораторная работа №5
лабораторная работа №5лабораторная работа №5
лабораторная работа №5Zhanna Kazakova
 
Functional Programming in Python
Functional Programming in PythonFunctional Programming in Python
Functional Programming in Pythondudarev
 
Построение графика кусочно-заданной функции с точками разрыва в Microsoft Excel
Построение графика кусочно-заданной функции с точками разрыва в Microsoft ExcelПостроение графика кусочно-заданной функции с точками разрыва в Microsoft Excel
Построение графика кусочно-заданной функции с точками разрыва в Microsoft ExcelВлад Трубников
 
функции
функциифункции
функцииgrin1964
 
Kubicheskaya funkciya grafik
Kubicheskaya funkciya grafikKubicheskaya funkciya grafik
Kubicheskaya funkciya grafikIvanchik5
 

What's hot (20)

6.2 Шаблоны функций
6.2 Шаблоны функций6.2 Шаблоны функций
6.2 Шаблоны функций
 
Программирование. Лекция 3
Программирование. Лекция 3Программирование. Лекция 3
Программирование. Лекция 3
 
3.3 Конструкторы и деструкторы
3.3 Конструкторы и деструкторы3.3 Конструкторы и деструкторы
3.3 Конструкторы и деструкторы
 
5.5 Ключевое слово friend
5.5 Ключевое слово friend5.5 Ключевое слово friend
5.5 Ключевое слово friend
 
4.2 Перегрузка
4.2 Перегрузка4.2 Перегрузка
4.2 Перегрузка
 
4.4 Таблица виртуальных методов
4.4 Таблица виртуальных методов4.4 Таблица виртуальных методов
4.4 Таблица виртуальных методов
 
2.2 Стек вызовов
2.2 Стек вызовов2.2 Стек вызовов
2.2 Стек вызовов
 
3.1 Структуры
3.1 Структуры3.1 Структуры
3.1 Структуры
 
4.3 Виртуальные методы
4.3 Виртуальные методы4.3 Виртуальные методы
4.3 Виртуальные методы
 
Proizvodnaya i grafiki_funkcii
Proizvodnaya i grafiki_funkciiProizvodnaya i grafiki_funkcii
Proizvodnaya i grafiki_funkcii
 
Matlab: Построение графика функции
Matlab: Построение графика функцииMatlab: Построение графика функции
Matlab: Построение графика функции
 
контрольная работа Variant i
контрольная работа Variant iконтрольная работа Variant i
контрольная работа Variant i
 
5.4 Ключевые слова static и inline
5.4 Ключевые слова static и inline5.4 Ключевые слова static и inline
5.4 Ключевые слова static и inline
 
практика 12
практика 12практика 12
практика 12
 
Matlab: Построение графика и решение уравнения
Matlab: Построение графика и решение уравненияMatlab: Построение графика и решение уравнения
Matlab: Построение графика и решение уравнения
 
лабораторная работа №5
лабораторная работа №5лабораторная работа №5
лабораторная работа №5
 
Functional Programming in Python
Functional Programming in PythonFunctional Programming in Python
Functional Programming in Python
 
Построение графика кусочно-заданной функции с точками разрыва в Microsoft Excel
Построение графика кусочно-заданной функции с точками разрыва в Microsoft ExcelПостроение графика кусочно-заданной функции с точками разрыва в Microsoft Excel
Построение графика кусочно-заданной функции с точками разрыва в Microsoft Excel
 
функции
функциифункции
функции
 
Kubicheskaya funkciya grafik
Kubicheskaya funkciya grafikKubicheskaya funkciya grafik
Kubicheskaya funkciya grafik
 

Viewers also liked

6.1 Шаблоны классов
6.1 Шаблоны классов6.1 Шаблоны классов
6.1 Шаблоны классовDEVTYPE
 
4.6 Особенности наследования в C++
4.6 Особенности наследования в C++4.6 Особенности наследования в C++
4.6 Особенности наследования в C++DEVTYPE
 
4. Обработка ошибок, исключения, отладка
4. Обработка ошибок, исключения, отладка4. Обработка ошибок, исключения, отладка
4. Обработка ошибок, исключения, отладкаDEVTYPE
 
5.1 Перегрузка операторов
5.1 Перегрузка операторов5.1 Перегрузка операторов
5.1 Перегрузка операторовDEVTYPE
 
2.3 Указатели и массивы
2.3 Указатели и массивы2.3 Указатели и массивы
2.3 Указатели и массивыDEVTYPE
 
3. Объекты, классы и пакеты в Java
3. Объекты, классы и пакеты в Java3. Объекты, классы и пакеты в Java
3. Объекты, классы и пакеты в JavaDEVTYPE
 
4.5 Объектно-ориентированное программирование
4.5 Объектно-ориентированное программирование4.5 Объектно-ориентированное программирование
4.5 Объектно-ориентированное программированиеDEVTYPE
 
6. Generics. Collections. Streams
6. Generics. Collections. Streams6. Generics. Collections. Streams
6. Generics. Collections. StreamsDEVTYPE
 
1. Введение в Java
1. Введение в Java1. Введение в Java
1. Введение в JavaDEVTYPE
 
5. Ввод-вывод, доступ к файловой системе
5. Ввод-вывод, доступ к файловой системе5. Ввод-вывод, доступ к файловой системе
5. Ввод-вывод, доступ к файловой системеDEVTYPE
 
Квадратичная математика
Квадратичная математикаКвадратичная математика
Квадратичная математикаDEVTYPE
 
Программирование: теоремы и задачи
Программирование: теоремы и задачиПрограммирование: теоремы и задачи
Программирование: теоремы и задачиDEVTYPE
 
3.6 Константность
3.6 Константность3.6 Константность
3.6 КонстантностьDEVTYPE
 
4.1 Наследование
4.1 Наследование4.1 Наследование
4.1 НаследованиеDEVTYPE
 
2.5 Ссылки
2.5 Ссылки2.5 Ссылки
2.5 СсылкиDEVTYPE
 

Viewers also liked (15)

6.1 Шаблоны классов
6.1 Шаблоны классов6.1 Шаблоны классов
6.1 Шаблоны классов
 
4.6 Особенности наследования в C++
4.6 Особенности наследования в C++4.6 Особенности наследования в C++
4.6 Особенности наследования в C++
 
4. Обработка ошибок, исключения, отладка
4. Обработка ошибок, исключения, отладка4. Обработка ошибок, исключения, отладка
4. Обработка ошибок, исключения, отладка
 
5.1 Перегрузка операторов
5.1 Перегрузка операторов5.1 Перегрузка операторов
5.1 Перегрузка операторов
 
2.3 Указатели и массивы
2.3 Указатели и массивы2.3 Указатели и массивы
2.3 Указатели и массивы
 
3. Объекты, классы и пакеты в Java
3. Объекты, классы и пакеты в Java3. Объекты, классы и пакеты в Java
3. Объекты, классы и пакеты в Java
 
4.5 Объектно-ориентированное программирование
4.5 Объектно-ориентированное программирование4.5 Объектно-ориентированное программирование
4.5 Объектно-ориентированное программирование
 
6. Generics. Collections. Streams
6. Generics. Collections. Streams6. Generics. Collections. Streams
6. Generics. Collections. Streams
 
1. Введение в Java
1. Введение в Java1. Введение в Java
1. Введение в Java
 
5. Ввод-вывод, доступ к файловой системе
5. Ввод-вывод, доступ к файловой системе5. Ввод-вывод, доступ к файловой системе
5. Ввод-вывод, доступ к файловой системе
 
Квадратичная математика
Квадратичная математикаКвадратичная математика
Квадратичная математика
 
Программирование: теоремы и задачи
Программирование: теоремы и задачиПрограммирование: теоремы и задачи
Программирование: теоремы и задачи
 
3.6 Константность
3.6 Константность3.6 Константность
3.6 Константность
 
4.1 Наследование
4.1 Наследование4.1 Наследование
4.1 Наследование
 
2.5 Ссылки
2.5 Ссылки2.5 Ссылки
2.5 Ссылки
 

Similar to 2.6 Динамическая память

C++ осень 2013 лекция 2
C++ осень 2013 лекция 2C++ осень 2013 лекция 2
C++ осень 2013 лекция 2Technopark
 
C++ осень 2012 лекция 9
C++ осень 2012 лекция 9C++ осень 2012 лекция 9
C++ осень 2012 лекция 9Technopark
 
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2Dima Dzuba
 
DEV Labs 2013. Can C++ Code Effeciency Be Comparable to That of Middle-Level ...
DEV Labs 2013. Can C++ Code Effeciency Be Comparable to That of Middle-Level ...DEV Labs 2013. Can C++ Code Effeciency Be Comparable to That of Middle-Level ...
DEV Labs 2013. Can C++ Code Effeciency Be Comparable to That of Middle-Level ...Alex V. Petrov
 
C++ осень 2013 лекция 9
C++ осень 2013 лекция 9C++ осень 2013 лекция 9
C++ осень 2013 лекция 9Technopark
 
C++ Базовый. Занятие 05.
C++ Базовый. Занятие 05.C++ Базовый. Занятие 05.
C++ Базовый. Занятие 05.Igor Shkulipa
 
Использование C++ для низкоуровневой платформозависимой разработки — Кирилл ...
 Использование C++ для низкоуровневой платформозависимой разработки — Кирилл ... Использование C++ для низкоуровневой платформозависимой разработки — Кирилл ...
Использование C++ для низкоуровневой платформозависимой разработки — Кирилл ...Yandex
 
«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС
«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС
«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНСit-people
 
СИ++ УМЕР. ДА ЗДРАВСТВУЕТ СИ++
СИ++ УМЕР. ДА ЗДРАВСТВУЕТ СИ++СИ++ УМЕР. ДА ЗДРАВСТВУЕТ СИ++
СИ++ УМЕР. ДА ЗДРАВСТВУЕТ СИ++Pavel Tsukanov
 
Лекция 8: Многопоточное программирование: Intel Threading Building Blocks
Лекция 8: Многопоточное программирование: Intel Threading Building BlocksЛекция 8: Многопоточное программирование: Intel Threading Building Blocks
Лекция 8: Многопоточное программирование: Intel Threading Building BlocksMikhail Kurnosov
 
Лекция 8. Intel Threading Building Blocks
Лекция 8. Intel Threading Building BlocksЛекция 8. Intel Threading Building Blocks
Лекция 8. Intel Threading Building BlocksMikhail Kurnosov
 
Лекция 7. Стандарт OpenMP (подолжение)
Лекция 7. Стандарт OpenMP (подолжение)Лекция 7. Стандарт OpenMP (подолжение)
Лекция 7. Стандарт OpenMP (подолжение)Mikhail Kurnosov
 
На что нужно обратить внимание при обзоре кода разрабатываемой библиотеки
На что нужно обратить внимание при обзоре кода разрабатываемой библиотекиНа что нужно обратить внимание при обзоре кода разрабатываемой библиотеки
На что нужно обратить внимание при обзоре кода разрабатываемой библиотекиAndrey Karpov
 
Soft labs. достижима ли в c++ эффективность языка среднего уровня
Soft labs. достижима ли в c++ эффективность языка среднего уровняSoft labs. достижима ли в c++ эффективность языка среднего уровня
Soft labs. достижима ли в c++ эффективность языка среднего уровняLuxoftTraining
 
C++ весна 2014 лекция 2
C++ весна 2014 лекция 2C++ весна 2014 лекция 2
C++ весна 2014 лекция 2Technopark
 
Евгений Лазин. Неизменяемая структура данных HAMT для создания БД в памяти
Евгений Лазин. Неизменяемая структура данных HAMT для создания БД в памятиЕвгений Лазин. Неизменяемая структура данных HAMT для создания БД в памяти
Евгений Лазин. Неизменяемая структура данных HAMT для создания БД в памятиFProg
 
Семинар 11. Параллельное программирование на MPI (часть 4)
Семинар 11. Параллельное программирование на MPI (часть 4)Семинар 11. Параллельное программирование на MPI (часть 4)
Семинар 11. Параллельное программирование на MPI (часть 4)Mikhail Kurnosov
 

Similar to 2.6 Динамическая память (20)

C++ осень 2013 лекция 2
C++ осень 2013 лекция 2C++ осень 2013 лекция 2
C++ осень 2013 лекция 2
 
Simd
SimdSimd
Simd
 
C++ осень 2012 лекция 9
C++ осень 2012 лекция 9C++ осень 2012 лекция 9
C++ осень 2012 лекция 9
 
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
 
DEV Labs 2013. Can C++ Code Effeciency Be Comparable to That of Middle-Level ...
DEV Labs 2013. Can C++ Code Effeciency Be Comparable to That of Middle-Level ...DEV Labs 2013. Can C++ Code Effeciency Be Comparable to That of Middle-Level ...
DEV Labs 2013. Can C++ Code Effeciency Be Comparable to That of Middle-Level ...
 
C++ осень 2013 лекция 9
C++ осень 2013 лекция 9C++ осень 2013 лекция 9
C++ осень 2013 лекция 9
 
C++ Базовый. Занятие 05.
C++ Базовый. Занятие 05.C++ Базовый. Занятие 05.
C++ Базовый. Занятие 05.
 
Использование C++ для низкоуровневой платформозависимой разработки — Кирилл ...
 Использование C++ для низкоуровневой платформозависимой разработки — Кирилл ... Использование C++ для низкоуровневой платформозависимой разработки — Кирилл ...
Использование C++ для низкоуровневой платформозависимой разработки — Кирилл ...
 
«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС
«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС
«Память и Python. Что надо знать для счастья?» Алексей Кузьмин, ЦНС
 
СИ++ УМЕР. ДА ЗДРАВСТВУЕТ СИ++
СИ++ УМЕР. ДА ЗДРАВСТВУЕТ СИ++СИ++ УМЕР. ДА ЗДРАВСТВУЕТ СИ++
СИ++ УМЕР. ДА ЗДРАВСТВУЕТ СИ++
 
Лекция 8: Многопоточное программирование: Intel Threading Building Blocks
Лекция 8: Многопоточное программирование: Intel Threading Building BlocksЛекция 8: Многопоточное программирование: Intel Threading Building Blocks
Лекция 8: Многопоточное программирование: Intel Threading Building Blocks
 
Лекция 8. Intel Threading Building Blocks
Лекция 8. Intel Threading Building BlocksЛекция 8. Intel Threading Building Blocks
Лекция 8. Intel Threading Building Blocks
 
Лекция 7. Стандарт OpenMP (подолжение)
Лекция 7. Стандарт OpenMP (подолжение)Лекция 7. Стандарт OpenMP (подолжение)
Лекция 7. Стандарт OpenMP (подолжение)
 
На что нужно обратить внимание при обзоре кода разрабатываемой библиотеки
На что нужно обратить внимание при обзоре кода разрабатываемой библиотекиНа что нужно обратить внимание при обзоре кода разрабатываемой библиотеки
На что нужно обратить внимание при обзоре кода разрабатываемой библиотеки
 
Soft labs. достижима ли в c++ эффективность языка среднего уровня
Soft labs. достижима ли в c++ эффективность языка среднего уровняSoft labs. достижима ли в c++ эффективность языка среднего уровня
Soft labs. достижима ли в c++ эффективность языка среднего уровня
 
Progr labrab-4-2013-c++
Progr labrab-4-2013-c++Progr labrab-4-2013-c++
Progr labrab-4-2013-c++
 
C++ весна 2014 лекция 2
C++ весна 2014 лекция 2C++ весна 2014 лекция 2
C++ весна 2014 лекция 2
 
Евгений Лазин. Неизменяемая структура данных HAMT для создания БД в памяти
Евгений Лазин. Неизменяемая структура данных HAMT для создания БД в памятиЕвгений Лазин. Неизменяемая структура данных HAMT для создания БД в памяти
Евгений Лазин. Неизменяемая структура данных HAMT для создания БД в памяти
 
Purely practical data structures
Purely practical data structuresPurely practical data structures
Purely practical data structures
 
Семинар 11. Параллельное программирование на MPI (часть 4)
Семинар 11. Параллельное программирование на MPI (часть 4)Семинар 11. Параллельное программирование на MPI (часть 4)
Семинар 11. Параллельное программирование на MPI (часть 4)
 

More from DEVTYPE

Рукописные лекции по линейной алгебре
Рукописные лекции по линейной алгебреРукописные лекции по линейной алгебре
Рукописные лекции по линейной алгебреDEVTYPE
 
1.4 Точечные оценки и их свойства
1.4 Точечные оценки и их свойства1.4 Точечные оценки и их свойства
1.4 Точечные оценки и их свойстваDEVTYPE
 
1.3 Описательная статистика
1.3 Описательная статистика1.3 Описательная статистика
1.3 Описательная статистикаDEVTYPE
 
1.2 Выборка. Выборочное пространство
1.2 Выборка. Выборочное пространство1.2 Выборка. Выборочное пространство
1.2 Выборка. Выборочное пространствоDEVTYPE
 
Continuity and Uniform Continuity
Continuity and Uniform ContinuityContinuity and Uniform Continuity
Continuity and Uniform ContinuityDEVTYPE
 
Coin Change Problem
Coin Change ProblemCoin Change Problem
Coin Change ProblemDEVTYPE
 
Recurrences
RecurrencesRecurrences
RecurrencesDEVTYPE
 
D-кучи и их применение
D-кучи и их применениеD-кучи и их применение
D-кучи и их применениеDEVTYPE
 
Диаграммы Юнга, плоские разбиения и знакочередующиеся матрицы
Диаграммы Юнга, плоские разбиения и знакочередующиеся матрицыДиаграммы Юнга, плоские разбиения и знакочередующиеся матрицы
Диаграммы Юнга, плоские разбиения и знакочередующиеся матрицыDEVTYPE
 
ЖАДНЫЕ АЛГОРИТМЫ
ЖАДНЫЕ АЛГОРИТМЫ ЖАДНЫЕ АЛГОРИТМЫ
ЖАДНЫЕ АЛГОРИТМЫ DEVTYPE
 
Скорость роста функций
Скорость роста функцийСкорость роста функций
Скорость роста функцийDEVTYPE
 
Asymptotic Growth of Functions
Asymptotic Growth of FunctionsAsymptotic Growth of Functions
Asymptotic Growth of FunctionsDEVTYPE
 
Кучи
КучиКучи
КучиDEVTYPE
 
Кодирование Хаффмана
Кодирование ХаффманаКодирование Хаффмана
Кодирование ХаффманаDEVTYPE
 
Жадные алгоритмы: введение
Жадные алгоритмы: введениеЖадные алгоритмы: введение
Жадные алгоритмы: введениеDEVTYPE
 
Разбор задач по дискретной вероятности
Разбор задач по дискретной вероятностиРазбор задач по дискретной вероятности
Разбор задач по дискретной вероятностиDEVTYPE
 
Разбор задач модуля "Теория графов ll"
Разбор задач модуля "Теория графов ll"Разбор задач модуля "Теория графов ll"
Разбор задач модуля "Теория графов ll"DEVTYPE
 
Наибольший общий делитель
Наибольший общий делительНаибольший общий делитель
Наибольший общий делительDEVTYPE
 
Числа Фибоначчи
Числа ФибоначчиЧисла Фибоначчи
Числа ФибоначчиDEVTYPE
 
О-символика
О-символикаО-символика
О-символикаDEVTYPE
 

More from DEVTYPE (20)

Рукописные лекции по линейной алгебре
Рукописные лекции по линейной алгебреРукописные лекции по линейной алгебре
Рукописные лекции по линейной алгебре
 
1.4 Точечные оценки и их свойства
1.4 Точечные оценки и их свойства1.4 Точечные оценки и их свойства
1.4 Точечные оценки и их свойства
 
1.3 Описательная статистика
1.3 Описательная статистика1.3 Описательная статистика
1.3 Описательная статистика
 
1.2 Выборка. Выборочное пространство
1.2 Выборка. Выборочное пространство1.2 Выборка. Выборочное пространство
1.2 Выборка. Выборочное пространство
 
Continuity and Uniform Continuity
Continuity and Uniform ContinuityContinuity and Uniform Continuity
Continuity and Uniform Continuity
 
Coin Change Problem
Coin Change ProblemCoin Change Problem
Coin Change Problem
 
Recurrences
RecurrencesRecurrences
Recurrences
 
D-кучи и их применение
D-кучи и их применениеD-кучи и их применение
D-кучи и их применение
 
Диаграммы Юнга, плоские разбиения и знакочередующиеся матрицы
Диаграммы Юнга, плоские разбиения и знакочередующиеся матрицыДиаграммы Юнга, плоские разбиения и знакочередующиеся матрицы
Диаграммы Юнга, плоские разбиения и знакочередующиеся матрицы
 
ЖАДНЫЕ АЛГОРИТМЫ
ЖАДНЫЕ АЛГОРИТМЫ ЖАДНЫЕ АЛГОРИТМЫ
ЖАДНЫЕ АЛГОРИТМЫ
 
Скорость роста функций
Скорость роста функцийСкорость роста функций
Скорость роста функций
 
Asymptotic Growth of Functions
Asymptotic Growth of FunctionsAsymptotic Growth of Functions
Asymptotic Growth of Functions
 
Кучи
КучиКучи
Кучи
 
Кодирование Хаффмана
Кодирование ХаффманаКодирование Хаффмана
Кодирование Хаффмана
 
Жадные алгоритмы: введение
Жадные алгоритмы: введениеЖадные алгоритмы: введение
Жадные алгоритмы: введение
 
Разбор задач по дискретной вероятности
Разбор задач по дискретной вероятностиРазбор задач по дискретной вероятности
Разбор задач по дискретной вероятности
 
Разбор задач модуля "Теория графов ll"
Разбор задач модуля "Теория графов ll"Разбор задач модуля "Теория графов ll"
Разбор задач модуля "Теория графов ll"
 
Наибольший общий делитель
Наибольший общий делительНаибольший общий делитель
Наибольший общий делитель
 
Числа Фибоначчи
Числа ФибоначчиЧисла Фибоначчи
Числа Фибоначчи
 
О-символика
О-символикаО-символика
О-символика
 

2.6 Динамическая память

  • 1. Программирование на языке C++ Лекция 2 Динамическая память Александр Смаль 1/8
  • 2. Зачем нужна динамическая память? ∙ Стек программы ограничен. Он не предназначен для хранения больших объемов данных. // Не умещается на стек double m[10000000] = {}; // 80 Mb ∙ Время жизни локальных переменных ограничено временем работы функции. ∙ Динамическая память выделяется в сегменте данных. ∙ Структура, отвечающая за выделение дополнительной памяти, называется кучей (не нужно путать с одноимённой структурой данных). ∙ Выделение и освобождение памяти управляется вручную. 2/8
  • 3. Выделение памяти в стиле C ∙ Стандартная библиотека cstdlib предоставляет четыре функции для управления памятью: void * malloc (size_t size ); void free (void * ptr); void * calloc (size_t nmemb , size_t size ); void * realloc(void * ptr , size_t size ); ∙ size_t — специальный целочисленный беззнаковый тип, может вместить в себя размер любого типа в байтах. ∙ Тип size_t используется для указания размеров типов данных, для индексации массивов и пр. ∙ void * — это указатель на нетипизированную память (раньше для этого использовалось char *). 3/8
  • 4. Выделение памяти в стиле C ∙ Функции для управления памятью в стиле C: void * malloc (size_t size ); void * calloc (size_t nmemb , size_t size ); void * realloc(void * ptr , size_t size ); void free (void * ptr); ∙ malloc — выделяет область памяти размера ≥ size. Данные не инициализируются. ∙ calloc — выделяет массив из nmemb размера size. Данные инициализируются нулём. ∙ realloc — изменяет размер области памяти по указателю ptr на size (если возможно, то это делается на месте). ∙ free — освобождает область памяти, ранее выделенную одной из функций malloc/calloc/realloc. 4/8
  • 5. Выделение памяти в стиле C ∙ Для указания размера типа используется оператор sizeof. // создание массива из 1000 int int * m = (int *) malloc (1000 * sizeof(int )); m[10] = 10; // изменение размера массива до 2000 m = (int *) realloc(m, 2000 * sizeof(int )); // освобождение массива free(m); // создание массива нулей m = (int *) calloc (3000 , sizeof(int )); free(m); m = 0; 5/8
  • 6. Выделение памяти в стиле C++ ∙ Язык C++ предоставляет два набора операторов для выделения памяти: 1. new и delete — для одиночных значений, 2. new [] и delete [] — для массивов. ∙ Версия оператора delete должна соответствовать версии оператора new. // выделение памяти под один int со значением 5 int * m = new int (5); delete m; // освобождение памяти // создание массива значений типа int m = new int [1000]; delete [] m; // освобождение памяти 6/8
  • 7. Типичные проблемы при работе с памятью ∙ Проблемы производительности: создание переменной на стеке намного “дешевле” выделения для неё динамической памяти. ∙ Проблема фрагментации: выделение большого количества небольших сегментов способствует фрагментации памяти. ∙ Утечки памяти: // создание массива из 1000 int int * m = new int [1000]; // создание массива из 2000 int m = new int [2000]; // утечка памяти // Не вызван delete [] m, утечка памяти 7/8
  • 8. Типичные проблемы при работе с памятью ∙ Неправильное освобождение памяти. int * m1 = new int [1000]; delete m1; // должно быть delete [] m1 int * p = new int (0); free(p); // совмещение функций C++ и C int * q1 = (int *) malloc(sizeof(int )); free(q1); free(q1); // двойное удаление int * q2 = (int *) malloc(sizeof(int )); free(q2); q2 = 0; // обнуляем указатель free(q2); // правильно работает для q2 = 0 8/8