Это до программиста, чтобы освободить при выходе ()? - PullRequest
3 голосов
/ 23 марта 2011

У меня есть программа, и когда я вводю неправильные данные с клавиатуры, она просто выходит с exit(1).

Я тестировал с Valgrind, и хотя это происходит, ошибок нет, но я вижувсе еще достижимы x байтов.

Итак, мой вопрос: программист должен освободить память, прежде чем нажать exit(), или ОС позаботится об этом?

Ответы [ 4 ]

3 голосов
/ 23 марта 2011

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

Однако valgrind здесь, чтобы помочь вам отследить утечку памяти и сообщит о каждой доступной области памяти, чтобы вы могли, если хотите, вручную освободить их.

3 голосов
/ 23 марта 2011

Это хорошая идея (и в достаточно старых версиях Windows она была необходима), но когда программа exit() s работает в современных операционных системах, все ее адресное пространство восстанавливается.

2 голосов
/ 23 марта 2011

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

0 голосов
/ 04 апреля 2011

Это плохая идея free памяти перед выходом () ing.Это бесполезно тратит время, и в многопоточных программах это может привести к ошибкам, если другие потоки не присоединяются первыми, и может получить доступ к некоторой выделенной памяти.1007 * утечка.Подумайте:

#include <stdlib.h>
void *a_global;
int main() {
  void *a_local = malloc(10);
  a_global = malloc(20);
}

gcc -g t.c && valgrind ./a.out

==12228== Copyright (C) 2002-2010, and GNU GPL'd, by Julian Seward et al.
==12228== Using Valgrind-3.7.0.SVN and LibVEX; rerun with -h for copyright info
==12228== Command: ./a.out
==12228== 
==12228== 
==12228== HEAP SUMMARY:
==12228==     in use at exit: 30 bytes in 2 blocks
==12228==   total heap usage: 2 allocs, 0 frees, 30 bytes allocated
==12228== 
==12228== LEAK SUMMARY:
==12228==    definitely lost: 10 bytes in 1 blocks
==12228==    indirectly lost: 0 bytes in 0 blocks
==12228==      possibly lost: 0 bytes in 0 blocks
==12228==    still reachable: 20 bytes in 1 blocks
==12228==         suppressed: 0 bytes in 0 blocks

Здесь, к тому времени, как вы достигли выхода, a_local уже вышел из области видимости.Существует нет способ освободить эту память;это потеряно навсегда.Это утечка.

OTOH, вы могли бы легко освободить a_global (вы просто не должны), она достижима, и не утечка.

...