Если сделать что то вроде этогоchar *ptr;
while(1){
ptr = NULL;
ptr = malloc(250);
.....
.....
free(ptr);
}то наблюдается некотораая "утечка памяти" :(
Это так и должно быть или я что то неправильно делаю ?
>Если сделать что то вроде этого
>
>char *ptr;
>
> while(1){
> ptr = NULL;
> ptr = malloc(250);
> .....
> .....
> free(ptr);
> }
>
>то наблюдается некотораая "утечка памяти" :(
>
>Это так и должно быть или я что то неправильно делаю ?
>
Все конечно зависит от реализации malloc, но почти наверняка это расход памяти на внутренние структуры malloc, это нормально. Если конечно на месте многоточий нет еще какого-нибудь кода выделяющего память:))
>Все конечно зависит от реализации malloc, но почти наверняка это расход памяти
>на внутренние структуры malloc, это нормально. Если конечно на месте многоточий
>нет еще какого-нибудь кода выделяющего память:))т.е. по любому придется мириться с эти безобразием?
не хотелось бы...пишу небольшого демона который по идее должен работать без перезапуска минимум месяца 2-3...
написать хочется хорошо, что б не пришлось как то еще со стороны приглядывать за ним каким нить скриптом...
>написать хочется хорошо, что б не пришлось как то еще со стороны
>приглядывать за ним каким нить скриптом...
Вообще надо смотреть в malloc.c . Там и ответ на вопрос. Не думаю, что это утечка, скорее какая-то необходимость.
Эта "утечка" называется "фрагментация".>пишу небольшого демона который по идее должен работать без перезапуска минимум месяца
>2-3...Надо уменьшить до необходимого минимума количество malloc'ов во время обработки запросов к демону. В идеале таких malloc'ов не должно быть вообще - всю необходимую память лучше распределить при инициализации демона.
>Эта "утечка" называется "фрагментация".Фрагментация образуется даже если я каждый раз запрашиваю кусочек памяти фиксированного размера ?
и кстати ptr = realloc(ptr, 250) тоже не помогает :(
ну да ладно. постараюсь свести к статическим массивам. Уж лучше выделю статический с запасом, чем постоянно по чуть-чуть отхватывать буду.
а еще вопросец: можно как нить из самой программы на ЦЕ узнать сколько сейчас текущщий процесс занимает памяти ?
>>Эта "утечка" называется "фрагментация".
>
>Фрагментация образуется даже если я каждый раз запрашиваю кусочек памяти
>фиксированного размера?It depends...
>ну да ладно. постараюсь свести к статическим массивам. Уж лучше выделю статический
>с запасом, чем постоянно по чуть-чуть отхватывать буду.С фиксированными размерами всё просто. Выделяешь вначале большой кусок, скажем на 1000 кусочков фиксированного размера. Выделяются и освобождаются кусочки оттуда элементарно (FIFO-список). Если первоначального большого куска не хватит, то выделяешь еще один по ходу. Освобождать большие куски как правило не имеет смысла - при следующем пике нагрузки все равно придется выделять.
>(FIFO-список)LIFO, конечно же. Опечатался.
действительно, есть утечка памяти, а есть выделение памяти на внутренние структуры. Одно от другого мало отличается при работе малыми количествами данных. Но если ваш процесс стал занимать раз в 100 больше памяти, чем это ему необходимо, то тут явно второе.Утечка возникает не тогда, когда усиленно используется malloc, а тогда, когда забывают вызывать на более ненужный блок выделенной памяти функцию free.
В этом коде это возможно при использовании goto, continue, break.
Рекомендация по использованию слотов может иметь место, если выделяемая область памяти имеет четко ограниченные границы, ну или хотя бы находится в диапазоне до getpagesize() байт.
Вообщем все зависит от задачи.
>Утечка возникает не тогда, когда усиленно используется malloc, а тогда, когда забывают
>вызывать на более ненужный блок выделенной памяти функцию free.
>
>В этом коде это возможно при использовании goto, continue, break.
ну я как то уже на 99.9% уверен в том что в остальном код без утечек (проверял как мог)но интереса ради сейчас попробую тот минимальный код :)
у malloc тип char или void?ptr = (char *)malloc(250);
char *ptr=NULL;
while(1){
if(ptr==NULL)ptr = (char*)malloc(250);
else fprintf(stderr,"ptr!=0");
.....
.....
free(ptr);
ptr = NULL;
}
Эмммм...... Сердечно прошу прощения, но при тестовых проверках именно моего же примера, получается, что
malloc + free == все как надо
Видимо все таки не на то грешу...
Буду искать тот самый 0.01% (тот процент неуверенности что где то накосячил)
>Буду искать тот самый 0.01% (тот процент неуверенности что где то накосячил)Да, конечно, фрагментация не возникнет на том примере что ты привел. Но в реальных условиях, когда память выделяется кусками разной длины и живущими разное время - вполне.
>Да, конечно, фрагментация не возникнет на том примере что ты привел. Но
>в реальных условиях, когда память выделяется кусками разной длины и живущими
>разное время - вполне.Это понятно.
Проблему локализовал в другом месте: Рекурсивная static-функция...
но это уже совсем другая история...
буду стараться осмыслить, что б снова так не опозориться с глупым вопросом на весь опеннет
а хотя может кто и тут подскажет ка правильно выдернуть из XML-я нужное поле?
у меня сейчас вот так:static void print_element_names(xmlNode * a_node, char *xResult, int size_of_xResult)
{
xmlNode *cur_node = NULL;for (cur_node = a_node; cur_node; cur_node = cur_node->next) {
if(!strcmp(cur_node->name,"result")){
strncpy(xResult, xmlNodeGetContent(cur_node->children), size_of_xResult-2);
}print_element_names(cur_node->children, xResult, size_of_xResult);
}
}эта гадость и пожирает память
>буду стараться осмыслить, что б снова так не опозориться с глупым вопросом
>на весь опеннетПолноте. Тут такие личности появляются, что тебе до них еще расти и расти :)
>strncpy(xResult, xmlNodeGetContent(cur_node->children), size_of_xResult-2);
Цитата из документации по libxml2:
Function: xmlNodeGetContent
...
Returns: a new xmlChar* or NULL if no content is available.
It's up to the caller to free the memory with xmlFree().Обрати внимние на последнюю строку.
>>strncpy(xResult, xmlNodeGetContent(cur_node->children), size_of_xResult-2);
>
>Цитата из документации по libxml2:
>
>Function: xmlNodeGetContent
>...
>Returns: a new xmlChar* or NULL if no content is available.
>It's up to the caller to free the memory with xmlFree().
>
>Обрати внимние на последнюю строку.Уххх! Спасибо!
Доверился экзамплам к libxml2 :(
а вот xmlFree() то в них и не хватало.да и дока у них уж больно мутно организована...
ну да ладно. теперь все работает.
спасибо за помосч!