Я предполагаю, что ваш вопрос сводится к тому, как ОС отбирает память процесса в случае сбоя этого процесса.
Хотя я самоучка в этих вопросах, я дам вам два способа, которыми ОС может обеспечить восстановление любой памяти, используемой процессом, в случае сбоя процесса.
В типичном современном процессоре и современной ОС с виртуальной памятью:
У вас есть два уровня выделения. Всякий раз, когда процесс вызывает malloc, malloc пытается удовлетворить запрос от уже доступных страниц памяти, которые ядро дало процессу. Если страниц недостаточно, malloc просит ядро выделить больше страниц.
В этом случае, когда происходит сбой процесса или даже если он нормально завершается, ядру все равно, что сделал malloc или какую память процесс забыл освободить. Нужно только освободить все страницы, которые он дал процессу.
В более простой ОС, которая не заботится о производительности, фрагментации памяти или виртуальной памяти и, возможно, даже не заботится о защите памяти:
Malloc / free полностью реализован на стороне ядра (например, системные вызовы). Всякий раз, когда процесс вызывает malloc / free, ядро выполняет всю работу и поэтому знает обо всей памяти, которая должна быть освобождена. После сбоя или выхода из процесса ядро может выполнить очистку. Поскольку ядро никогда не должно аварийно завершать работу и вести учет всей выделенной памяти на процесс, это тривиально.
Как я уже сказал, я самоучка, и я не проверял, как, например, Linux или Windows реализуют это.