|
0 / 0 / 0
Регистрация: 27.11.2014
Сообщений: 20
|
||||||
Освобождение динамической памяти25.12.2018, 16:19. Показов 4785. Ответов 23
Метки нет (Все метки)
Добрый день, объясните, пожалуйста, как правильно удалять выделенную динамическую память? Вот пример задачи, где массив произвольного размера может быть введен пользователем или взят из файла. Соответственно при вызове соответствующей функции выделяется память, массив вводится и сохраняется в выделенной памяти, чтобы его можно было вывести на экран. Если после этого снова вызывается функция ввода массива пользователем/из файла, то ранее выделенная память должна быть удалена, а новая выделиться, но компилятор мою интерпретацию такой логики не поддерживает.
Да и вообще в функции ввода из файла что-то не то. С клавиатуры можно вводить сколько угодно раз новый массив (правда освобождается ли при этом память, не знаю), а из файла в память ничего не сохраняется (срабатывает метка "массив пустой")
0
|
||||||
| 25.12.2018, 16:19 | |
|
Ответы с готовыми решениями:
23
Освобождение динамической памяти Освобождение динамической памяти
|
|
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,913
|
|
| 25.12.2018, 17:02 | |
|
87 строка: создаете локальную переменную, перекрывающую глобальную. Выделяете под нее память, но не освобождаете.
60, 69 строки: возможна попытка освобождения невыделенной памяти 17 строка: не проверяете успешность выделения памяти (грубая ошибка) 116 строка: не освобождаете память в конце программы
0
|
|
|
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
|
||
| 25.12.2018, 17:11 | ||
|
1) Стандартный new в случае ошибки не возвращает nullptr, а выбрасывает исключение. 2) Выбрасывает если повезет. Ибо если используется overcommit, об ошибке вы узнаете лишь при попытке записать в "выделенную" память.
0
|
||
|
0 / 0 / 0
Регистрация: 27.11.2014
Сообщений: 20
|
||||||||||||||||||||
| 25.12.2018, 17:56 [ТС] | ||||||||||||||||||||
|
Как правильно освободить память? Нельзя же удалить её сразу после заполнения массива
0
|
||||||||||||||||||||
|
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,913
|
||||||||||||||||||||
| 25.12.2018, 18:24 | ||||||||||||||||||||
|
Какая разница, будет ли это if или try-catch? Все равно программа не может продолжать выполнение если не смогла выделить память. Такие ошибки надо отлавливать всегда.
0
|
||||||||||||||||||||
|
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
|
||
| 25.12.2018, 18:33 | ||
|
0
|
||
|
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,913
|
|
| 25.12.2018, 19:32 | |
|
Угу. А потом в более сложной программе не возникнет даже мысли поставить проверку, поскольку привычки нет. И будет ТС искать проблему где угодно, но не в операторе new, или недооткрытом файле, который точно так же поленился проверить, или еще в каком не менее дурацком месте.
0
|
|
|
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
|
||
| 25.12.2018, 20:35 | ||
|
Если стоит задача найти проблему с отладчиком, он сам подсветит необработанный throw. Если стоит задача найти проблему без отладчика, надо минимум стек-трейс делать. Потому как что толку от диагностического сообщения "где-то вылетел bad_alloc, подробности неизвестны"? Но стек-трейс это для топикстартера явно слишком круто. Если же стоит задача просто аварийно закрыть программу, так это уже компилятор сделал.
0
|
||
|
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,913
|
|
| 25.12.2018, 23:16 | |
|
Моя задача в данном случае - приучить ТСа всегда делать проверку возвращаемого значения, всегда явно освобождать память и закрывать открытые ресурсы (вроде файлов). Если это дойдет до автоматизма на учебных примерах, он не будет отвлекаться на подобную рутину в будущем. А это чуть более информативные сообщения об ошибках программы вроде "программа
Сколько раз уже видел здесь как новички даже открытие файла не проверяют, а потом жалуются "почему программа не работает". А она просто входной файл не там ищет.
0
|
|
|
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
|
|||
| 26.12.2018, 00:10 | |||
|
0
|
|||
|
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,913
|
|||
| 26.12.2018, 00:44 | |||
|
Программа может захватывать не только std::ifstream файлы. И далеко не для все из них оформлены в виде объектов с деструкторами.
0
|
|||
|
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
|
|||
| 26.12.2018, 01:14 | |||
|
Во-первых, что будем делать с ошибками в функциях типа std::log? Проверять возвращаемое значение - нельзя впихнуть std::log в выражение. Использовать errno - глобальная переменная и проблемы с потокобезопасностью (да, errno сделали thread_local, но он не бесплатен). Во-вторых, обработка ошибок это по большей части просто "заверши функцию и перебрось код ошибки дальше". И только пять return спустя исполнение добирается до обработчика ошибок рисующего красивое окошко "что-то сбойнуло". Исключения это перебрасывание делают сами, а с кодами ошибки лишняя писанина. А скорость - зависит от реализации обработчика исключений. Его можно делать и в стиле "все накладные расходы переносятся на момент возбуждения ошибки" (а этот момент возможно и не настанет никогда).
0
|
|||
|
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,913
|
|
| 26.12.2018, 08:25 | |
|
Как минимум, в "красивом окошке" написать где именно возникла ошибка. Какой именно файл недоступен, сколько именно памяти не хватило.
Если ошибка возникла во время записи логов (что с ними вообще может случиться, файл что ли не создается?) напрямую сообщить пользователю что пошло не так и как это исправить.
0
|
|
|
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
|
|||||||
| 26.12.2018, 17:00 | |||||||
0
|
|||||||
|
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,913
|
||
| 27.12.2018, 10:26 | ||
|
Разумеется, я говорю об общих принципах обработки ошибок. Какой конкретно механизм при этом будет использоваться - проверка возвращаемого значения, проверка errno, отлов исключений - безразлично. Возвращаясь к теме дискуссии, я настаиваю на обязательной проверке всего что может сломаться, особенно в учебных программах. Ну, разве что арифметику уж слишком сложно проверять каждый раз, да и вероятность такой ошибки невелика.
0
|
||
|
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
|
||
| 27.12.2018, 16:27 | ||
|
1
|
||
|
Mental handicap
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
|
|
| 27.12.2018, 17:19 | |
|
0
|
|
|
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
|
||
| 27.12.2018, 17:22 | ||
|
0
|
||
|
Mental handicap
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
|
|
| 27.12.2018, 17:44 | |
|
Renji, насколько я помню, если у нас не хватит физической памяти винда сделает файл подкачки (с n-ым размером) и будет пихать туда, затем если этого не хватит она просто начнет увеличивать размер файла подкачки (цифры могут быть поражающие психику), ну и когда и этот файл подкачки закончится (подойдет к какому-то лимиту, когда уже дальше некуда) у винды не остается ничего как экстренно кого-то убить.
Добавлено через 11 минут Хотя в современных реалиях винда вроде даже перед тем как выделить виртуальную память процессу проверит есть ли место под файл подкачки, вдруг если понадобится и сейчас файлы подкачки себе не позволяют расти так немеренно, а при критических стиациях его не хватки вроде рандомно убивать не будет, начнут всякие Explorerы/видео драйвера лагать, те выполнение замедляется. зы Т.е. самой поддержки оверкомита у винды нету, но ВП разрешает выделять памятит больше чем есть физической.
0
|
|
|
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
|
|||||||
| 27.12.2018, 17:45 | |||||||
0
|
|||||||
| 27.12.2018, 17:45 | |
|
Помогаю со студенческими работами здесь
20
Резервирование памяти/освобождение памяти для трехмерного массива Освобождение памяти в C++ Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
|
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу,
и светлой Луне.
В мире
покоя нет
и люди
не могут жить в тишине.
А жить им немного лет.
|
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила»
«Время-Деньги»
«Деньги -Пуля»
|
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
|
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога
Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога
Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
|
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
|
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога
Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
|