On Mon, Sep 19, 2005 at 11:43:54PM +0900, Ivan Fedorov wrote: > Программы имеют свойство толстеть со временем, так что IMHO лучше сразу > такое вырезать на корню. Здесь немного другой случай. В программах, которые "разово" запускаются из командной строки, free() можно не делать. Это специально так было в UNIX'е придумано. malloc по сути всего лишь раздвигает хип. man brk. Утечка памяти -- это не тогда, когда на какой-нибудь malloc() нету комплементарного free(), а когда хип с течением времени продолжает необоснованно раздвигаться; истощая, как говорится, системные реусурсы. > Я вот однажды потратил год, на отлов плавающего бага. А все потому, что > кое-кто поленился подумать немного и исправить его. Он просто поставил > костыль, который работал почти всегда... но иногда не работал... Вот > когда этот баг меня достал окончательно, я три ночи не спал вообще. Я > ложился в 6 часов, а вставал в 7:30... Я целенаправленно отловил и > исправил этот баг, а ведь изначально он ловился ОЧЕНЬ легко... ;( > > Давайте не будем усложнять себе жизнь в будущем - если делаешь, то делай > как надо, а не как получится! Ох... okay. --- bloom.c- 2005-09-18 19:06:33 +0000 +++ bloom.c 2005-09-19 14:44:50 +0000 @@ -109,6 +123,7 @@ int main(int argc, char *argv[]) size_t n = 1024; double p = 0.01; char *e = NULL; + BF *bf = NULL; int c; while ((c = getopt(argc, argv, "n:p:e:")) != -1) { switch (c) { @@ -133,14 +148,14 @@ int main(int argc, char *argv[]) int exists; FILE *fp = fopen(argv[optind], "r"); assert(fp); - BF *bf = BF_load(fp); + bf = BF_load(fp); exists = BF_exists(bf, e, strlen(e)); exit(!exists); } else { char line[1024]; - BF *bf = BF_new(n, p); FILE *fp = fopen(argv[optind], "r"); assert(fp); + bf = BF_new(n, p); while (fgets(line, sizeof(line), fp)) { int len = strlen(line); if (line[len - 1] == '\n') @@ -149,5 +164,81 @@ int main(int argc, char *argv[]) } BF_save(bf, stdout); } + free(bf); return 0; }