56 / 52 / 21
Регистрация: 01.01.2012
Сообщений: 347
|
|
1 | |
Состояние кучи после завершения приложения05.12.2015, 00:15. Показов 4057. Ответов 26
Метки нет (Все метки)
Всем доброго времени суток!
Я в процессе работы программы распределил память под определенные объекты и закрыл приложение. Вопрос: что осталось в тех ячейках (старые значения, или система все почистила)?
0
|
05.12.2015, 00:15 | |
Ответы с готовыми решениями:
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
|
Ушел с форума
|
|
05.12.2015, 13:47 | 6 |
Сообщение было отмечено no_wearines как решение
Решение
В современных операционных системах при завершении процесса вся его
виртуальная память перестает существовать, все дескрипторы закрываются и все прочие ресурсы, запрошенные у операционной системы, возвращаются. Память, которая использовалась приложением, после его завершения перестает быть доступной другим приложениям и узнать, что там лежало, можно только очень-очень специализированными средствами, которые умеют копаться в физической памяти, в кэшах процессора, в PTE и т.п. Принцип почти такой же, как это происходит с файлом после его удаления с диска. Но это отнюдь не значит, что если ты "намусорил" - то убирать не стоит.
1
|
56 / 52 / 21
Регистрация: 01.01.2012
Сообщений: 347
|
|
05.12.2015, 13:55 [ТС] | 7 |
Подожди, а как она перестает быть доступной? Куда деваются эти ячейки из ОЗУ?
(сотку процессов закроешь, так и памяти не наберешься) - че тут не так
0
|
Ушел с форума
|
|
05.12.2015, 13:56 | 8 |
ОЗУ - это ресурс. Когда процесс создается, ему выделяется этот ресурс. Когда завершается -
ресурс возвращается операционной системе. Когда-нибудь эти же страницы ОЗУ будут выданы другому процессу, но от "жизнедеятельности" предыдущего процесса там уже ничего не останется, никакой старой информации, только одни нули.
1
|
56 / 52 / 21
Регистрация: 01.01.2012
Сообщений: 347
|
|
05.12.2015, 14:01 [ТС] | 9 |
Вот, что мня интересовало!
Значит все-таки система подчищает следы закрытого процесса. А очистка через delete - получается, просто правила хорошего тона (нагадил-убери)?
0
|
Ушел с форума
|
|
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
|
Ушел с форума
|
|
05.12.2015, 15:36 | 14 |
Да.
В частности: VirtualAlloc function https://msdn.microsoft.com/en-... s.85).aspx точнее, поверх соответствующего системного сервиса NtAllocateVirtualMemory. Который возвращает память, заполненную нулями.
0
|
7785 / 6553 / 2983
Регистрация: 14.04.2014
Сообщений: 28,621
|
|
05.12.2015, 15:54 | 15 |
Убежденный, там о выделении памяти говорится. Я-то говорил про освобождение.
0
|
Ушел с форума
|
|
05.12.2015, 16:00 | 16 |
А как приложение получит память, не выделив ее ?
Вообще да, мы сейчас обсуждаем некоего сферического коня. Потому что после завершения приложения уже никакой его виртуальной памяти, ни тем более кучи или аллокаторов, которые поверх этой виртуальной памяти построены, уже не существует.
0
|
7785 / 6553 / 2983
Регистрация: 14.04.2014
Сообщений: 28,621
|
|
05.12.2015, 16:15 | 17 |
Память как физическое устройство не очищается после освобождения приложениями, потому что это трата времени. Я слышал об очистке из соображений безопасности, но это само приложение делает, как я понял.
0
|
Ушел с форума
|
|
05.12.2015, 16:19 | 18 |
Хочешь сказать, что если только что запущенное приложение покопается в
своем адресном пространстве (оставим пока то, как именно оно это сделает), то там будет "мусор" от старых процессов ?
0
|
7785 / 6553 / 2983
Регистрация: 14.04.2014
Сообщений: 28,621
|
|
05.12.2015, 16:26 | 19 |
Точно не скажу, если там всё через ту функцию, то видимо нет. Но если проверить ту память, которая освобождена после приложения и никому не выделена, то вполне возможно.
0
|
Ушел с форума
|
|
05.12.2015, 16:50 | 20 |
Если физическая страница памяти не закреплена ни за каким процессом, то читать ее
прикладные процессы (т.е. в ring-3) не могут. А при создании нового процесса, а точнее, при инициализации его адресного пространства, все физические страницы, выделяемые под стек, кучу, под working set, под структуры типа PEB/TEB и т.п., то есть, под любые данные, которые по дефолту присутствуют в каждом новом процессе, зануляются. Где-то это происходит как результат выделения юзермодной памяти, - и тогда это сводится к NtAllocateVirtualMemory, - где-то ядро это делает в явном виде, в старых Виндах функция называлась что-то типа MiZeroPhysicalMemory, в новых, видимо, аналогично (не проверял). Ну то есть, получается, что прочесть содержимое физической памяти можно только если система спроецирует ее на какую-то виртуальную память какого-либо процесса, а тогда память будет обнулена. Для системных структур, которые находятся в диапазоне адресов пользователя и которые создаются системой, система сама зануляет соответствующие физические страницы явно. Все это делается именно как защита от попадания в процесс информации, которая для него явно не предназначена. А при освобождении памяти, когда физические страницы уходят обратно системе, тогда никакого зануления, насколько я знаю, не делается, потому что это избыточная операция. Немного запутанно получилось, ну вот как-то так...
1
|
05.12.2015, 16:50 | |
05.12.2015, 16:50 | |
Помогаю со студенческими работами здесь
20
Как закрыть DOS-овское окно после завершения в нем приложения? Как закрыть DOS-овское окно после завершения в нем приложения? Вывести текст с консоли в Memo, но только после завершения консольного приложения Куда девается "убежавшая" память после завершения работы приложения Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |