|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
||||||
Память освобождается, но значение остается03.03.2016, 20:53. Показов 4071. Ответов 78
Метки нет (Все метки)
Почему в следующем коде, программа завершается принудительно, но в консоли все равно видно значение переменной, память которой была удалена?
Откуда берется это значение?
0
|
||||||
| 03.03.2016, 20:53 | |
|
Ответы с готовыми решениями:
78
Не освобождается память Освобождается ли память? Память освобождается не полностью |
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
||
| 03.03.2016, 22:58 [ТС] | ||
|
DrOffset,
Про физическое удаление ясное дело Не правильно выразился, имел ввиду освобождение памяти а не исчезновение куска микросхемы)Всем спасибо! Было очень интересно
0
|
||
|
93 / 6 / 5
Регистрация: 25.02.2016
Сообщений: 30
|
|||||||
| 03.03.2016, 23:00 | |||||||
0
|
|||||||
|
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
|
||
| 03.03.2016, 23:02 | ||
|
Главное - это не то, что в этих ячейках лежит, а можно ли получить эти ячейки для работы. Если получить можно, то памяти достаточно. Именно поэтому память не очищается (например не забивается нулями) в таких случаях - это бессмысленная работа. А утечка, говоря по-простому, - это когда память уже не нужна, но использовать ее никто не может, потому что свободной ее не пометили.
0
|
||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|
| 03.03.2016, 23:04 [ТС] | |
|
TheCalligrapher,
Большое спасибо! Но странно то, что нельзя в таких случаях обойтись каким нибудь сигналом для освобождения мелкого куска этого большого блока и соответствующего значения. Не спец, может на машинном уровне это действительно не оправданно и слишком ресурсозатратно
0
|
|
|
Вездепух
13239 / 6871 / 1827
Регистрация: 18.10.2014
Сообщений: 17,417
|
||||||
| 03.03.2016, 23:05 | ||||||
|
Такой двухуровневый механизм реализуется именно потому, что запрос/освобождение памяти у ОС - операция тяжелая и выполнять ее для каждого маленького блока памяти - расточительно. Не говоря уже о том, что ОС может вообще не умет выделять маленькие блоки памяти.
Однако, если вы при помощи 'new' попробуете выделить достаточно большой блок памяти, то смысла в двухуровневом механизме не будет, и как правило запрос на память будет отправлен прямо в ОС. После освобождения такого блока, память будет возвращена обратно ОС, т.е. память станет свободной с точки зрения ОС. В результате попытка доступа к такой памяти будет приводить к срабатываниям механизмов защиты памяти в современных ОС. Например
1
|
||||||
|
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
|
||
| 03.03.2016, 23:08 | ||
0
|
||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|||
| 03.03.2016, 23:12 [ТС] | |||
|
castaway, Наверное мы просто не понимаем друг друга А если это огромный объект и у меня на сервере есть многов других процессов, которым тоже нужна память? Условно говоря есть веб сервер который может получить тяжелый запрос, на выполнение которого потребуется много памяти. И потому что программа на С++ вовремя не избавилась от большого объекта, процесс веб сервера будет успешно завален. Тоже не честноДумаю тебя себя изжила Многое от вас узнал коллеги! Спасибо каждому из вас!
0
|
|||
|
Вездепух
13239 / 6871 / 1827
Регистрация: 18.10.2014
Сообщений: 17,417
|
||
| 03.03.2016, 23:13 | ||
|
Если быть совершенно точным, в самом Windows есть Heap API, который позволяет работать с маленькими блоками памяти и библиотеки времени выполнения активно используют этот API. Но это не принципиально, ибо суть тут в том, что Heap API - это тоже менеджер памяти второго уровня, работающий как описано выше. Т.е. мелкие блоки, освобожденные Heap API - это по-прежнему лишь маленькие регионы внутри большого блока, запрошенного у ОС. ОС не знает, что происходит внутри этого блока и никаких механизмов защиты памяти внутри блока предоставлять не может в принципе. Именно поэтому у вас получается доступиться к "освобожденной" памяти.
0
|
||
|
93 / 6 / 5
Регистрация: 25.02.2016
Сообщений: 30
|
|||
| 03.03.2016, 23:15 | |||
|
0
|
|||
|
3 / 3 / 1
Регистрация: 03.03.2016
Сообщений: 86
|
|
| 03.03.2016, 23:20 | |
|
Самый простой способ , без подключения библиотек-это cin.get();
После нажатия клавиши программа закроется.
0
|
|
|
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
|
||
| 03.03.2016, 23:21 | ||
![]() Ну и в реальности скорее всего ничего не завалится, т.к. современные операционные системы не так просты и умеют сбрасывать давно неиспользуемые занятые участки памяти на диск, освобождая тем самым место для актуальных данных в озу. Можно начать читать отсюда и отсюда.
0
|
||
|
Вездепух
13239 / 6871 / 1827
Регистрация: 18.10.2014
Сообщений: 17,417
|
||
| 03.03.2016, 23:29 | ||
|
Если вас она никак не устраивает, это означает, что заниматься менеджментом динамической памяти вам придется вручную, самому, а не полагаться на 'new'. Это совершенно нормально.
0
|
||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||
| 03.03.2016, 23:42 | ||
|
процессы не имеют прямого доступа к физической памяти. вместо этого, они оперируют так называемыми "страницами виртуальной памяти". один и тот же адрес в двух разных процессах связан с разными участками физической памяти. это сделано для безопасности. что бы один процесс не смог попортить память другого. за этот механизм отвечает операционная система. и работает он достаточно медленно. и поэтому, процесс заранее, ещё при старте хапает сразу же большой кусок виртуальной памяти. и удерживает её в своем пользовании. что бы лишний раз не напрягать операционную систему. за это отвечает так называемый "рантайм с++", особая библиотека, которая идет в поставке с компилятором, и с которой прозрачно для программиста линкуется каждая программа. когда в программе встречается new, специальный менеджер ищет в этом куске свободный участок, помечает его занятым, и выдает его адрес. когда встречается delete - соответственно, помечает свободным. в будущем, по очередному запросу программы, может заново его выдать. таким образом, до тех пор, пока процесс не израсходовал весь запас заранее отжатой у системы памяти, он может свободно играццо в своей собственной песочнице. и не думать о судьбе освобожденных кусочков.
1
|
||
|
93 / 6 / 5
Регистрация: 25.02.2016
Сообщений: 30
|
||||||
| 04.03.2016, 00:44 | ||||||
|
В продолжение отличного изложения материала hoggy, приложу карту памяти. Исходный код почти один в один как у ТС за небольшим исключением:
0
|
||||||
|
|
||
| 04.03.2016, 18:43 | ||
|
Другое дело, если вы имеете в виду доступ к определённым адресам физической памяти которые проецируются один в один, но и это утверждение не совсем верно без указания ОС, т.к. в защищённом режиме (если речь вообще идёт о x86 или x86_64) всё адресное пространство можно спроецировать один в один - виртуальное к физическому.
1
|
||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||
| 04.03.2016, 18:46 | ||
|
к чему именно мы обращаемся. виртуальный слой полностью абстрагирует процесс от "физической реальности". физически, данные вообще могут оказаться на жестком диске, а не в оперативной памяти, например.
1
|
||
|
|
||
| 04.03.2016, 18:59 | ||
|
Я понимаю что вы имеете в виду, просто такие щекотливые нюансы в таких темах следует уточнять.
1
|
||
|
Вездепух
13239 / 6871 / 1827
Регистрация: 18.10.2014
Сообщений: 17,417
|
||
| 04.03.2016, 19:16 | ||
|
0
|
||
|
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
|
|
| 04.03.2016, 19:17 | |
|
castaway, так ведь доступ к физ памяти означает означает отсуствие абстракции про страницы виртуальной памяти. Как по мне доступ не прямой, если приходится "переадресовывать"
0
|
|
| 04.03.2016, 19:17 | |
|
Не освобождается память при выбросе исключений Правильно ли в данной программе освобождается память?
Освобождается ли память выделенная под массив после вызова деструктора класса Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version
1. 2003 - 06 - Designing Virtual Worlds (1st Edition)
Автор: Richard A. Bartle | Объем: 768 стр.
Ссылки: Amazon
. . .
|
Родители токсичные абьюзеры по отношению к своим детям ругают их оскорбляют не любят
zorxor 08.11.2026
Жить в атмосфере постоянных оскорблений, критики и холодности со стороны родителей — это тяжелое и болезненное испытание, которое оставляет глубокие эмоциональные раны. Токсичное и абьюзивное. . .
|
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы.
Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
|
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version
Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
|
|
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров".
Задача:
Запрет инициалов.
Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
|
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . .
Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
|
Красочные поля с номером страницы svg+background-image
russiannick 04.11.2026
Красочные поля с номером страницы не менее важны чем в эпоху бумажных книг.
Посему спешу представить почтеннейшей публике этот важный инструмент который эти поля и формирует.
В процессе разработки. . .
|
Вступаем в новую фазу генерации favicons, векторную.
russiannick 02.11.2026
Теперь нет нужды скрывать что используется простой svg. Исходный код изображения помещаем в поле и жмем кнопку. Исходник преобразуется в вид корректный для помещения в favicon или в url(). Нажатие. . .
|