|
0 / 0 / 0
Регистрация: 27.11.2014
Сообщений: 20
|
||||||
Освобождение динамической памяти25.12.2018, 16:19. Показов 4668. Ответов 23
Метки нет (Все метки)
Добрый день, объясните, пожалуйста, как правильно удалять выделенную динамическую память? Вот пример задачи, где массив произвольного размера может быть введен пользователем или взят из файла. Соответственно при вызове соответствующей функции выделяется память, массив вводится и сохраняется в выделенной памяти, чтобы его можно было вывести на экран. Если после этого снова вызывается функция ввода массива пользователем/из файла, то ранее выделенная память должна быть удалена, а новая выделиться, но компилятор мою интерпретацию такой логики не поддерживает.
Да и вообще в функции ввода из файла что-то не то. С клавиатуры можно вводить сколько угодно раз новый массив (правда освобождается ли при этом память, не знаю), а из файла в память ничего не сохраняется (срабатывает метка "массив пустой")
0
|
||||||
| 25.12.2018, 16:19 | |
|
Ответы с готовыми решениями:
23
Освобождение динамической памяти Освобождение динамической памяти
|
|
4078 / 2676 / 432
Регистрация: 09.09.2017
Сообщений: 11,885
|
|
| 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
|
||||||||||||||||||||
|
4078 / 2676 / 432
Регистрация: 09.09.2017
Сообщений: 11,885
|
||||||||||||||||||||
| 25.12.2018, 18:24 | ||||||||||||||||||||
|
Какая разница, будет ли это if или try-catch? Все равно программа не может продолжать выполнение если не смогла выделить память. Такие ошибки надо отлавливать всегда.
0
|
||||||||||||||||||||
|
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
|
||
| 25.12.2018, 18:33 | ||
|
0
|
||
|
4078 / 2676 / 432
Регистрация: 09.09.2017
Сообщений: 11,885
|
|
| 25.12.2018, 19:32 | |
|
Угу. А потом в более сложной программе не возникнет даже мысли поставить проверку, поскольку привычки нет. И будет ТС искать проблему где угодно, но не в операторе new, или недооткрытом файле, который точно так же поленился проверить, или еще в каком не менее дурацком месте.
0
|
|
|
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
|
||
| 25.12.2018, 20:35 | ||
|
Если стоит задача найти проблему с отладчиком, он сам подсветит необработанный throw. Если стоит задача найти проблему без отладчика, надо минимум стек-трейс делать. Потому как что толку от диагностического сообщения "где-то вылетел bad_alloc, подробности неизвестны"? Но стек-трейс это для топикстартера явно слишком круто. Если же стоит задача просто аварийно закрыть программу, так это уже компилятор сделал.
0
|
||
|
4078 / 2676 / 432
Регистрация: 09.09.2017
Сообщений: 11,885
|
|
| 25.12.2018, 23:16 | |
|
Моя задача в данном случае - приучить ТСа всегда делать проверку возвращаемого значения, всегда явно освобождать память и закрывать открытые ресурсы (вроде файлов). Если это дойдет до автоматизма на учебных примерах, он не будет отвлекаться на подобную рутину в будущем. А это чуть более информативные сообщения об ошибках программы вроде "программа
Сколько раз уже видел здесь как новички даже открытие файла не проверяют, а потом жалуются "почему программа не работает". А она просто входной файл не там ищет.
0
|
|
|
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
|
|||
| 26.12.2018, 00:10 | |||
|
0
|
|||
|
4078 / 2676 / 432
Регистрация: 09.09.2017
Сообщений: 11,885
|
|||
| 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
|
|||
|
4078 / 2676 / 432
Регистрация: 09.09.2017
Сообщений: 11,885
|
|
| 26.12.2018, 08:25 | |
|
Как минимум, в "красивом окошке" написать где именно возникла ошибка. Какой именно файл недоступен, сколько именно памяти не хватило.
Если ошибка возникла во время записи логов (что с ними вообще может случиться, файл что ли не создается?) напрямую сообщить пользователю что пошло не так и как это исправить.
0
|
|
|
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
|
|||||||
| 26.12.2018, 17:00 | |||||||
0
|
|||||||
|
4078 / 2676 / 432
Регистрация: 09.09.2017
Сообщений: 11,885
|
||
| 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++ Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|
|
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
|
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
|
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут.
В век Веб все очень привыкли к дизайну Single-Page-Application .
Быстренько разберем подход "на фреймах".
Мы делаем одну. . .
|
Фото: Daniel Greenwood
kumehtar 13.11.2025
|
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга,
Ты же видел моря и метели.
Как сменялись короны и стяги,
Как эпохи стрелою летели.
- Этот мир — это крылья и горы,
Снег и пламя, любовь и тревоги,
И бескрайние. . .
|