Обычно я освобождаю каждый выделенный блок, как только я уверен, что с ним покончено. Сегодня точка входа моей программы может быть main(int argc, char *argv[])
, но завтра она может быть foo_entry_point(char **args, struct foo *f)
и напечатана как указатель на функцию.
Так что, если это произойдет, у меня есть утечка.
Что касается вашего второго вопроса, если бы моя программа принимала ввод, такой как = 5, я бы выделил место для a, или перераспределил бы то же пространство для последующего a = "foo". Это будет выделяться до:
- Пользователь набрал 'unset a'
- Моя функция очистки была введена, либо обслуживая сигнал, либо пользователь набрал 'quit'
Я не могу вспомнить ни одну современную ОС, которая не освобождает память после завершения процесса. Опять же, free () это дешево, почему бы не убрать? Как говорили другие, такие инструменты, как valgrind, отлично подходят для обнаружения утечек, о которых вам действительно нужно беспокоиться. Несмотря на то, что блоки, которые вы демонстрируете, будут помечены как «все еще доступные», это просто дополнительный шум на выходе, когда вы пытаетесь убедиться, что у вас нет утечек.
Еще один миф: « Если его в main (), мне не нужно его освобождать », это неверно. Учтите следующее:
char *t;
for (i=0; i < 255; i++) {
t = strdup(foo->name);
let_strtok_eat_away_at(t);
}
Если это произошло до разветвления / демонизации (и теоретически работает вечно), ваша программа только что утекла с неопределенным размером t 255 раз.
Хорошая, хорошо написанная программа должна всегда убирать за собой. Освободите всю память, очистите все файлы, закройте все дескрипторы, отсоедините все временные файлы и т. Д. Эту функцию очистки следует выполнять при нормальном завершении или при получении различного рода фатальных сигналов, если вы не хотите оставлять некоторые файлы лежащими вокруг, чтобы вы могли обнаружить сбой и возобновить.
На самом деле, будь добр к бедной душе, которая должна поддерживать твои вещи, когда ты переходишь к другим вещам ... отдай их им 'valgrind clean':)