2013-03-19 1 views
2

В программе C, если есть динамически выделенные воспоминания, которые не были освобождены после завершения выхода программы с exit(100);, возникает ли проблема с утечкой памяти? Например:Утечки утечки происходят, если выход (exitcode) в C?

int main (void) { 
    char str1[] = "Hello World" 
    char *str2; 
    str2 = malloc(strlen(str1 + 1)); 

    if (str2) 
     exit(101); // memory leaks? 

    free(str2); 
    return 0; 
} 
+0

Это может зависеть от вашей ОС, но ответ No – Sergio

+0

Операционная система, скорее всего, не будет. Ваш * процесс * делает, за этот короткий момент, прежде чем он фактически прекратится. Я предполагаю, что все завершение - вероятно, гораздо большая проблема, с которой вам придется столкнуться. – WhozCraig

ответ

3

Не в современных операционных системах, нет. ОС автоматически собирает всю память, когда процесс умирает.

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

+0

Но это по-прежнему плохая практика. –

+0

@ H2CO3 Это не плохая практика. Я помню пост Р. .. где он выступал за то, что не нужно освобождать память прямо перед выходом. – cnicutar

+0

Мне интересно, что такое рассуждение. Если R .. написал это, это должно быть правдой, но я не вижу, как это * не * концептуальная проблема. –

1

Вся выделенная память, выделенная с использованием malloc, должна быть явно освобождена путем вызова free. В то время как ваша программа продолжает работать, память нераспределенная таким образом может быть вызвана утечкой (при условии, что она вообще не используется). Однако, как только ваша программа/процесс вернет ОС, просто восстановит память, выделенную для этого процесса. ОС не понимает утечка он просто возвращает обратно то, что он дал процессу.

1

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