Главная » Просмотр файлов » Лекция 4. Динамическая память

Лекция 4. Динамическая память (1114996)

Файл №1114996 Лекция 4. Динамическая память (Александр Смаль - PDF-лекции)Лекция 4. Динамическая память (1114996)2019-05-08СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла

Лекция 4. Динамическая памятьЛекция 4. Динамическая памятьАлександр СмальCS центр1 октября 2014Санкт-Петербургhttp://compscicenter.ru1/21Лекция 4. Динамическая памятьЗачем нужна динамическая память?∙ Стек программы ограничен. Он не предназначен дляхранения больших объемов данных.// Не умещается на стекdouble m [10000000] = {}; // 80 Mb∙ Время жизни локальных переменных ограничено временемработы функции.∙ Динамическая память выделяется в сегменте данных.∙ Структура, отвечающая за выделение дополнительнойпамяти, называется кучей (не нужно путать содноимённой структурой данных).∙ Выделение и освобождение памяти управляется вручную.http://compscicenter.ru2/21Лекция 4. Динамическая памятьВыделение памяти в стиле C∙ Стандартная библиотека cstdlib предоставляет четырефункции для управления памятью:void * malloc ( size_tvoidfree( void *void * calloc ( size_tvoid * realloc ( void *size );ptr );nmemb , size_t size );ptr , size_t size );∙ size_t — специальный целочисленный беззнаковый тип,может вместить в себя размер любого типа в байтах.∙ Тип size_t используется для указания размеров типовданных, для индексации массивов и пр.∙ void * — это указатель на нетипизированную память(раньше для этого использовалось char *).http://compscicenter.ru3/21Лекция 4.

Динамическая памятьВыделение памяти в стиле C∙ Функции для управления памятью в стиле C:void * malloc ( size_tvoid * calloc ( size_tvoid * realloc ( void *voidfree( void *size );nmemb , size_t size );ptr , size_t size );ptr );∙ malloc — выделяет область памяти размера ≥ size.Данные не инициализируются.∙ calloc — выделяет массив из nmemb размера size.Данные инициализируются нулём.∙ realloc — изменяет размер области памяти по указателюptr на size (если возможно, то это делается на месте).∙ free — освобождает область памяти, ранее выделеннуюодной из функций malloc/calloc/realloc.http://compscicenter.ru4/21Лекция 4. Динамическая памятьВыделение памяти в стиле C∙ Для указания размера типа используется оператор sizeof.// создание массива из 1000 intint * m = ( int *) malloc (1000 * sizeof ( int ));m [10] = 10;// изменение размера массива до 2000m = ( int *) realloc (m , 2000 * sizeof ( int ));// освобождение массиваfree ( m );// создание массива нулейm = ( int *) calloc (3000 , sizeof ( int ));free ( m );m = 0;http://compscicenter.ru5/21Лекция 4.

Динамическая памятьВыделение памяти в стиле C++∙ Язык C++ предоставляет два набора операторов длявыделения памяти:1. new и delete — для одиночных значений,2. new [] и delete [] — для массивов.∙ Версия оператора delete должна соответствовать версииоператора new.// выделение памяти под один int со значением 5int * m = new int (5);delete m ; // освобождение памяти// создание массива нулейm = new int [1000];delete [] m ; // освобождение памятиhttp://compscicenter.ru6/21Лекция 4. Динамическая памятьТипичные проблемы при работе с памятью∙ Проблемы производительности: создание переменной настеке намного “дешевле”, выделения её в динамическойпамяти.∙ Проблема фрагментации: выделение большого количестванебольших сегментов способствует фрагментации памяти.∙ Утечки памяти:// создание массива из 1000 intint * m = new int [1000];// создание массива из 2000 intm = new int [2000]; // утечка памяти// Не вызван delete [] m, утечка памятиhttp://compscicenter.ru7/21Лекция 4.

Динамическая памятьТипичные проблемы при работе с памятью∙ Неправильное освобождение памяти.int * m1 = new int [1000];delete m1 ; // должно быть delete [] m1int * p = new int (0);free ( p ); // совмещение функций C++ и Cint * q1 = ( int *) malloc ( sizeof ( int ));free ( q1 );free ( q1 ); // двойное удалениеint * q2 = ( int *) malloc ( sizeof ( int ));free ( q2 );q2 = 0;// обнуляем указательfree ( q2 ); // правильно работает для q2 = 0http://compscicenter.ru8/21Лекция 4. Динамическая памятьМногомерные встроенные массивы∙ C++ позволяет определять многомерные массивы:int m2d [2][3] = { {1 , 2 , 3} , {4 , 5 , 6} };for ( size_t i = 0; i != 2; ++ i ) {for ( size_t j = 0; j != 3; ++ j ) {cout << m2d [ i ][ j ] << ’ ’;}cout << endl ;}∙ Элементы m2d располагаются в памяти “по строчкам”.∙ Размерность массивов может быть любой, но на практикередко используют массивы размерности > 4.int m4d [2][3][4][5] = {};http://compscicenter.ru9/21Лекция 4.

Динамическая памятьДинамические массивы∙ Для выделение одномерных динамических массивовобычно используется оператор new [].int * m1d = new int [100];∙ Какой тип должен быть у указателя на двумерныйдинамический массив?∙∙∙∙Пусть m — указатель на двумерный массив типа int.Значит m[i][j] имеет тип int (точнее int &).m[i][j] ⇔ *(m[i] + j), т.е. тип m[i] — int *.аналогично, m[i] ⇔ *(m + i), т.е.

тип m — int **.∙ Чему соответствует значение m[i]?Это адрес строки с номером i.∙ Чему соответствует значение m?Это адрес массива с указателями на строки.http://compscicenter.ru10/21Лекция 4. Динамическая памятьДвумерные массивыДавайте рассмотрим создание массива 5 × 4.m[0]m[1]m[2]m[3]m[4]mint ** m = new int * [5];for ( size_t i = 0; i != 5; ++ i )m [ i ] = new int [4];http://compscicenter.ru11/21Лекция 4. Динамическая памятьДвумерные массивыВыделение и освобождение двумерного массива размера a × b.int ** create_array2d ( size_t a , size_t b ) {int ** m = new int *[ a ];for ( size_t i = 0; i != a ; ++ i )m [ i ] = new int [ b ];return m ;}void free_array2d ( int ** m , size_t a , size_t b ) {for ( size_t i = 0; i != a ; ++ i )delete [] m [ i ];delete [] m ;}При создании массива оператор new вызывается (a + 1) раз.http://compscicenter.ru12/21Лекция 4.

Динамическая памятьДвумерные массивы: эффективная схемаРассмотрим эффективное создание массива 5 × 4.m[0]m[1]m[2]m[3]m[4]mint ** m = new int * [5];m [0] = new int [5 * 4];for ( size_t i = 1; i != 5; ++ i )m [ i ] = m [ i - 1] + 4;http://compscicenter.ru13/21Лекция 4. Динамическая памятьДвумерные массивы: эффективная схемаЭффективное выделение и освобождение двумерного массиваразмера a × b.int ** create_array2d ( size_t a , size_t b ) {int ** m = new int *[ a ];m [0] = new int [ a * b ];for ( size_t i = 1; i != a ; ++ i )m [ i ] = m [ i - 1] + b ;return m ;}void free_array2d ( int ** m , size_t a , size_t b ) {delete [] m [0];delete [] m ;}При создании массива оператор new вызывается 2 раза.http://compscicenter.ru14/21Лекция 4. Динамическая памятьСтроковые литералы∙ Строки — это массивы символов типа char,заканчивающиеся нулевым символом.// массив ’H’, ’e’, ’l’, ’l’, ’o’, ’\0’char s [] = " Hello " ;∙ Строки могут содержать управляющиепоследовательности:1.2.3.4.5.\n\t\\\"\0—————перевод строки,символ табуляции,символ ’\’,символ ’"’,нулевой символ.cout << " List :\ n \t - C ,\ n \t - C ++.\ n " ;http://compscicenter.ru15/21Лекция 4.

Динамическая памятьРабота со строками в стиле C∙ Библиотека cstring предлагает множество функций дляработы со строками (char *).char s1 [100] = " Hello " ;cout << strlen ( s1 ) << endl ; // 5char s2 [] = " , world ! " ;strcat ( s1 , s2 );char s3 [6] = {72 , 101 , 108 , 108 , 111};if ( strcmp ( s1 , s3 ) == 0)cout << " s1 == s3 " << endl ;∙ Работа со строками в стиле C предполагает кропотливуюработу с ручным выделением памяти.http://compscicenter.ru16/21Лекция 4. Динамическая памятьРабота со строками в стиле C++Библиотека string предлагает обёртку над строками, котораяпозволяет упростить все операции со строками.# include < string >using namespace std ;int main () {string s1 = " Hello " ;cout << s1 .

size () << endl ; // 5string s2 = " , world ! " ;s1 = s1 + s2 ;if ( s1 == s2 )cout << " s1 == s3 " << endl ;return 0;}http://compscicenter.ru17/21Лекция 4. Динамическая памятьВвод-вывод в стиле C∙ Библиотека cstdio предлагает функции для работы состандартным вводом-выводом.∙ Для вывода используется функция printf:# include < cstdio >int main () {int h = 20 , m = 14;printf ( " Time : % d :% d \ n " , h , m );printf ( " It ’s %.2 f hours to midnight \ n " ,((24 - h ) * 60.0 - m ) / 60);return 0;}http://compscicenter.ru18/21Лекция 4. Динамическая памятьВвод-вывод в стиле C∙ Библиотека cstdio предлагает функции для работы состандартным вводом-выводом.∙ Для ввода используется функция scanf:# include < cstdio >int main () {int a = 0 , b = 0;printf ( " Enter a and b : " );scanf ( " % d % d " , &a , & b );printf ( " a + b = % d \ n " , ( a + b ));return 0;}∙ Ввод-вывод в стиле C достаточно сложен и небезопасен(типы аргументов не проверяются).http://compscicenter.ru19/21Лекция 4.

Динамическая памятьВвод-вывод в стиле C++∙ В C++ ввод-вывод реализуется через библиотеку iostream.# include < string ># include < iostream >using namespace std ;int main () {string name ;cout << " Enter your name : " ;cin >> name ; // считывается словоcout << " Hi , " << name << endl ;return 0;}∙ Реализация ввода-вывода в стиле C++ типобезопасна.http://compscicenter.ru20/21Лекция 4. Динамическая памятьРабота с файлами в стиле C++∙ Библиотека fstream обеспечивает работу с файлами.# include < string ># include < fstream >using namespace std ;int main () {string name ;ifstream input ( " input .

txt " );input >> name ;ofstream output ( " output . txt " );output << " Hi , " << name << endl ;return 0;}∙ Файлы закроются при выходе из функции.http://compscicenter.ru21/21.

Характеристики

Тип файла
PDF-файл
Размер
226,63 Kb
Тип материала
Высшее учебное заведение

Тип файла PDF

PDF-формат наиболее широко используется для просмотра любого типа файлов на любом устройстве. В него можно сохранить документ, таблицы, презентацию, текст, чертежи, вычисления, графики и всё остальное, что можно показать на экране любого устройства. Именно его лучше всего использовать для печати.

Например, если Вам нужно распечатать чертёж из автокада, Вы сохраните чертёж на флешку, но будет ли автокад в пункте печати? А если будет, то нужная версия с нужными библиотеками? Именно для этого и нужен формат PDF - в нём точно будет показано верно вне зависимости от того, в какой программе создали PDF-файл и есть ли нужная программа для его просмотра.

Список файлов лекций

Свежие статьи
Популярно сейчас
Как Вы думаете, сколько людей до Вас делали точно такое же задание? 99% студентов выполняют точно такие же задания, как и их предшественники год назад. Найдите нужный учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
6384
Авторов
на СтудИзбе
307
Средний доход
с одного платного файла
Обучение Подробнее