LINUX.ORG.RU

readdir


0

0

struct dirent * readdir(DIR*);

из описания выидно, что возвращает ссылку на dirent. Вопрос: следует ли чистить за этой функцией память? Если да, то почему попытка очистки приводит к ошибке segmentation fault, а если не чистить, то память кушается очень сильно.

anonymous

Кушается кэш а не память, а кэш может быть в любой момент сброшен системой.

anonymous
()

а man прочитать?

The readdir() function returns a pointer to a dirent structure representing the next directory entry in the directory stream pointed to by dir.

ananas ★★★★★
()

В glibc скорее всего возвращается указатель на статическую переменную функции readdir, естественно, освободить память в glibc/.bss через free не получится

освобождать вообще ничего не нужно
просто нужно иметь в виду, что следующий readdir запишет dirent по тому же адресу, посему возвращаемое readdir значение стоит перед повторным использованием readdir нужно скопировать

Murr ★★
()
Ответ на: комментарий от Murr

Хорошо бы что бы все оказались правы. Но, в самом деле когда раздел подкачки использвоан на половину(у меня он 512мб) память уже не съедается. Но когда пробегаешь отладчиком и смотришь адреса выдаваемые readdir'ом они разные все время. Такие вот дела.

anonymous
()
Ответ на: комментарий от anonymous

Посмотрел только что код glibc - был не прав. Там opendir выделяет с помощью malloc структуру, куда readdir читает данные. closedir освобождает память с помощью free. Может в твоей glibc сие реализовано немного иначе... и посему free не проходит (хотя странно что код readdir мог меняться).

А ты вообще closedir делаешь?

Murr ★★
()
Ответ на: комментарий от Murr

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

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.