Ну, я тоже довольно долго об этом думал, и я попытался провести несколько тестов, чтобы лучше понять, что происходит под капотом. Стандартный ответ таков: после вызова delete вам не следует ожидать ничего хорошего от доступа к этой области памяти.
Однако этого мне показалось недостаточно. Что на самом деле происходит при вызове delete (ptr) ? Вот что я нашел. Я использую g ++ в Ubuntu 16.04, так что это может сыграть свою роль в результатах.
При использовании оператора удаления я впервые ожидал, что освобожденная память будет возвращена системе для использования в других процессах. Позвольте мне сказать , что этого не произойдет ни при каких обстоятельствах, которые я пробовал.
Память, освобожденная с помощью delete , по-видимому, по-прежнему выделена для программы, в которой она сначала выделена с помощью new . Я пытался, и после вызова delete не происходит уменьшения использования памяти. У меня было программное обеспечение, которое обрабатывало около 30 МБ списков с помощью новых вызовов, а затем освобождало их с последующими delete вызовами. Случилось так, что, глядя на системный монитор во время работы программы, даже после долгого сна после вызовов delete , потребление памяти моей программой было таким же. Нет уменьшения! Это означает, что delete не освобождает память для системы.
На самом деле, похоже, что память, выделенная программой, его навсегда! Тем не менее, дело в том, что в случае освобождения память может снова использоваться той же самой программой без необходимости ее выделения. Я попытался выделить 15 МБ, освободить их, а затем выделить еще 15 МБ данных, и программа никогда не использовала 30 МБ. Системный монитор всегда показывал около 15 МБ. Что касается предыдущего теста, я просто изменил порядок, в котором происходили события: половина выделения, половина освобождения, другая половина распределения.
Итак, очевидно, память, используемая программой, может увеличиваться, но никогда не уменьшаться . Я думал, что, возможно, память действительно будет освобождена для других процессов в критических ситуациях, например, когда памяти больше не будет. В конце концов, какой смысл в том, чтобы программа сохраняла свою память навсегда, когда другие процессы просят об этом? Поэтому я снова выделил 30 МБ, и , освобождая их , я запустил memtester
с таким большим количеством физической памяти, какой только мог. Я ожидал увидеть, как моя программа раздает свою память меместеру. Но угадайте, этого не произошло!
Я сделал короткий скринкаст, в котором показывается вещь в действии:
Чтобы быть на 100% честным, была ситуация, в которой что-то произошло. Когда я пытался использовать memtester с большей доступной физической памятью в середине процесса удаления моей программы, объем памяти, используемой моей программой, уменьшился примерно до 3 МБ. Процесс memtester был автоматически уничтожен, а то, что произошло, было еще более удивительным! Использование памяти моей программы увеличивалось с каждым вызовом удаления! Это было так, как будто Ubuntu восстанавливал всю свою память обратно после инцидента с меместером.
Взято из
http://www.thecrowned.org/c-delete-operator-really-frees-memory