[devel] Re: bloom filters

Alexey Tourbin =?iso-8859-1?q?at_=CE=C1_altlinux=2Eru?=
Пн Сен 19 19:03:26 MSD 2005


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;
 }

----------- следующая часть -----------
Было удалено вложение не в текстовом формате...
Имя     : =?iso-8859-1?q?=CF=D4=D3=D5=D4=D3=D4=D7=D5=C5=D4?=
Тип     : application/pgp-signature
Размер  : 189 байтов
Описание: =?iso-8859-1?q?=CF=D4=D3=D5=D4=D3=D4=D7=D5=C5=D4?=
Url     : <http://lists.altlinux.org/pipermail/devel/attachments/20050919/d69bea47/attachment-0001.bin>


Подробная информация о списке рассылки Devel