Как освобождается динамически выделенное пространство, когда программа прерывается с помощью Ctrl-C? - PullRequest
9 голосов
/ 02 сентября 2011

С учетом следующего кода:

#include <stdio.h>

int main()
{
    int *p;
    p = (int *)malloc(10 * sizeof(int));

    while(1);
    return 0;
}

Когда вышеуказанный код компилируется и запускается и прерывается во время выполнения при нажатии Ctrl + C , как выделяется память дляp освобожден?Какова роль операционной системы здесь?И чем он отличается от того, что в случае C ++, с использованием оператора new?

Ответы [ 4 ]

13 голосов
/ 02 сентября 2011

Когда процесс завершается, операционная система освобождает всю память, которую использовал процесс.

Причина, по которой люди часто сталкиваются с утечками памяти, даже когда ОС освобождает память, используемую вашим приложением, когда она завершает работу, заключается в том, что обычно нетривиальные приложения будут работать в течение длительного времени, медленно поглощая всю память на система. Это меньше проблем для очень коротких программ. (Но вы никогда не сможете сказать, когда одна строка станет огромной программой, поэтому не допускайте утечек памяти даже в небольших программах.)

3 голосов
/ 02 сентября 2011

Кстати (в дополнение к Сету Карнеги сказал):

Используя подпрограммы в <signal.h>, вы можете поймать сигнал SIGINT (прерывание) для обработки Ctrl + C любым способом, например, для очистки любых важных ресурсов. не только память (например, закрытие файлов, что позволяет избежать потери буферизованного и еще не записанного содержимого или аккуратного закрытия сетевых подключений).

0 голосов
/ 02 сентября 2011

память на самом деле совсем не "свободна ()".

память, полученная операционной системой, имеет размер страницы (обычно 4 КБ памяти). всякий раз, когда процессу не хватает памяти, он получает дополнительные страницы, это пространство, которое фактически использует malloc (). когда процесс завершается, все страницы возвращаются в операционную систему, что делает ненужными бесплатные вызовы. если ваша программа - сервер или аналогичный, то каждый фрагмент памяти, который никогда не освобождается, будет возвращен только тогда, когда программа действительно уничтожена, что сделает ее еще более голодной.

0 голосов
/ 02 сентября 2011

Полное объяснение _exit здесь:

http://pubs.opengroup.org/onlinepubs/9699919799/functions/_Exit.html

То же самое происходит, когда процесс завершается в результате фатального сигнала.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...