56 / 52 / 21
Регистрация: 01.01.2012
Сообщений: 347
1

Состояние кучи после завершения приложения

05.12.2015, 00:15. Показов 4057. Ответов 26
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем доброго времени суток!

Я в процессе работы программы распределил память под определенные объекты и закрыл приложение.
Вопрос: что осталось в тех ячейках (старые значения, или система все почистила)?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.12.2015, 00:15
Ответы с готовыми решениями:

После завершения работы приложения вылезла ошибка
Что значит эта ошибка и как исправить? В целом приложение работает правильно но после закрытия...

Неизвестная ошибка после завершения работы приложения
После каждого закрытия приложения вылетает вот такая ошибка: System.BadImageFormatException не...

Сохранение значения переменной после завершения работы приложения
Можно ли сохранить значение переменной (As String) после завершения работы приложения?

После завершения приложения окно исчезает. Как его задержать?
Вопрос: после ввода окно приложения мгновенно исчезает ... main :: IO () main = do putStrLn...

26
7785 / 6553 / 2983
Регистрация: 14.04.2014
Сообщений: 28,621
05.12.2015, 07:55 2
Ты должен освобождать память, которую выделил - это главное. А ячейки никто специально не очищает.
0
56 / 52 / 21
Регистрация: 01.01.2012
Сообщений: 347
05.12.2015, 11:31  [ТС] 3
смотри, как я понимаю этот момент:

когда я использую new система мне выделяет участок памяти в адресном пространстве моего процесса. Я закидую туда какие нибудь значения и т.д.

А когда процесс завершает свою работу, система просто убирает границы адресного пространства. Получается, если я не очистил содержимое по завершению, оно там и останется?
0
7785 / 6553 / 2983
Регистрация: 14.04.2014
Сообщений: 28,621
05.12.2015, 12:36 4
Да.
1
56 / 52 / 21
Регистрация: 01.01.2012
Сообщений: 347
05.12.2015, 13:37  [ТС] 5
слушай, а как можно увидеть что в той ячейке после завершения программы? Может есть какой-то редактор?
0
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
05.12.2015, 13:47 6
Лучший ответ Сообщение было отмечено no_wearines как решение

Решение

Цитата Сообщение от no_wearines Посмотреть сообщение
когда процесс завершает свою работу, система просто убирает границы адресного пространства. Получается, если я не очистил содержимое по завершению, оно там и останется?
В современных операционных системах при завершении процесса вся его
виртуальная память перестает существовать, все дескрипторы закрываются и
все прочие ресурсы, запрошенные у операционной системы, возвращаются.

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

Но это отнюдь не значит, что если ты "намусорил" - то убирать не стоит.
1
56 / 52 / 21
Регистрация: 01.01.2012
Сообщений: 347
05.12.2015, 13:55  [ТС] 7
Цитата Сообщение от Убежденный Посмотреть сообщение
Память, которая использовалась приложением, после его завершения
перестает быть доступной другим приложениям
Подожди, а как она перестает быть доступной? Куда деваются эти ячейки из ОЗУ?
(сотку процессов закроешь, так и памяти не наберешься) - че тут не так
0
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
05.12.2015, 13:56 8
ОЗУ - это ресурс. Когда процесс создается, ему выделяется этот ресурс. Когда завершается -
ресурс возвращается операционной системе. Когда-нибудь эти же страницы ОЗУ будут
выданы другому процессу, но от "жизнедеятельности" предыдущего процесса там уже
ничего не останется, никакой старой информации, только одни нули.
1
56 / 52 / 21
Регистрация: 01.01.2012
Сообщений: 347
05.12.2015, 14:01  [ТС] 9
Цитата Сообщение от Убежденный Посмотреть сообщение
Когда-нибудь эти же страницы ОЗУ будут
выданы другому процессу, но от "жизнедеятельности" предыдущего процесса там уже
ничего не останется, никакой старой информации, только одни нули.
Вот, что мня интересовало!
Значит все-таки система подчищает следы закрытого процесса. А очистка через delete - получается, просто правила хорошего тона (нагадил-убери)?
0
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
05.12.2015, 14:05 10
delete уничтожает объекты, которые больше не нужны.
Если ты все время будешь делать new и не делать delete, то рано или поздно память
процесса закончится и ему станет плохо. Кроме того, внутри самого объекта могут быть
ссылки на более "тяжелые" объекты, на другие ресурсы и т.п. Так что это не просто
хороший тон, а необходимое условие для "выживания" процесса.
1
56 / 52 / 21
Регистрация: 01.01.2012
Сообщений: 347
05.12.2015, 14:06  [ТС] 11
ВСЕ ДОШЛО!
Всем спасибо, все свободны!
0
7785 / 6553 / 2983
Регистрация: 14.04.2014
Сообщений: 28,621
05.12.2015, 14:13 12
Цитата Сообщение от Убежденный Посмотреть сообщение
никакой старой информации, только одни нули
Это какое-то нововведение из-за увлечения безопасностью? Разве Windows обнуляет память?
0
56 / 52 / 21
Регистрация: 01.01.2012
Сообщений: 347
05.12.2015, 14:18  [ТС] 13
опа, тема снова открыта
0
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
05.12.2015, 15:36 14
Цитата Сообщение от nmcf Посмотреть сообщение
Разве Windows обнуляет память?
Да.
В частности:

VirtualAlloc function
https://msdn.microsoft.com/en-... s.85).aspx
...
Memory allocated by this function is automatically initialized to zero.
...
Куча, Global(Local)Alloc, new/malloc - все они построены поверх VirtualAlloc, а
точнее, поверх соответствующего системного сервиса NtAllocateVirtualMemory.
Который возвращает память, заполненную нулями.
0
7785 / 6553 / 2983
Регистрация: 14.04.2014
Сообщений: 28,621
05.12.2015, 15:54 15
Убежденный, там о выделении памяти говорится. Я-то говорил про освобождение.
0
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
05.12.2015, 16:00 16
А как приложение получит память, не выделив ее ?

Вообще да, мы сейчас обсуждаем некоего сферического коня.
Потому что после завершения приложения уже никакой его виртуальной памяти,
ни тем более кучи или аллокаторов, которые поверх этой виртуальной памяти
построены, уже не существует.
0
7785 / 6553 / 2983
Регистрация: 14.04.2014
Сообщений: 28,621
05.12.2015, 16:15 17
Память как физическое устройство не очищается после освобождения приложениями, потому что это трата времени. Я слышал об очистке из соображений безопасности, но это само приложение делает, как я понял.
0
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
05.12.2015, 16:19 18
Хочешь сказать, что если только что запущенное приложение покопается в
своем адресном пространстве (оставим пока то, как именно оно это сделает),
то там будет "мусор" от старых процессов ?
0
7785 / 6553 / 2983
Регистрация: 14.04.2014
Сообщений: 28,621
05.12.2015, 16:26 19
Цитата Сообщение от Убежденный Посмотреть сообщение
если только что запущенное приложение покопается в
своем адресном пространстве
Точно не скажу, если там всё через ту функцию, то видимо нет. Но если проверить ту память, которая освобождена после приложения и никому не выделена, то вполне возможно.
0
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
05.12.2015, 16:50 20
Если физическая страница памяти не закреплена ни за каким процессом, то читать ее
прикладные процессы (т.е. в ring-3) не могут.

А при создании нового процесса, а точнее, при инициализации его адресного пространства,
все физические страницы, выделяемые под стек, кучу, под working set, под структуры типа
PEB/TEB и т.п., то есть, под любые данные, которые по дефолту присутствуют в каждом
новом процессе, зануляются. Где-то это происходит как результат выделения юзермодной
памяти, - и тогда это сводится к NtAllocateVirtualMemory, - где-то ядро это делает в
явном виде, в старых Виндах функция называлась что-то типа MiZeroPhysicalMemory, в
новых, видимо, аналогично (не проверял).

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

А при освобождении памяти, когда физические страницы уходят обратно системе,
тогда никакого зануления, насколько я знаю, не делается, потому что это
избыточная операция.

Немного запутанно получилось, ну вот как-то так...
1
05.12.2015, 16:50
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.12.2015, 16:50
Помогаю со студенческими работами здесь

Как закрыть DOS-овское окно после завершения в нем приложения?
Как программно отследить завершение DOS-овского приложения и закрыть соответствующее DOS-овское...

Как закрыть DOS-овское окно после завершения в нем приложения?
Как программно отследить завершение DOS-овского приложения и закрыть соответсвующее DOS-овское окно?

Вывести текст с консоли в Memo, но только после завершения консольного приложения
Программа выводить текст с консоли в Memo, но только после завершения консольного приложения. Как...

Куда девается "убежавшая" память после завершения работы приложения
Не знаю, где спросить об этом, но думаю, что по адресу :) Если в приложени утечка памяти, то после...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru