The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"malloc + free == утечка памяти"
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [Проследить за развитием треда]

"malloc + free == утечка памяти"  
Сообщение от Savva email(ok) on 23-Янв-07, 17:36 
Если сделать что то вроде этого

char *ptr;

while(1){
   ptr = NULL;
   ptr = malloc(250);
   .....
   .....
   free(ptr);
}

то наблюдается некотораая "утечка памяти" :(

Это так и должно быть или я что то неправильно делаю ?

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

 Оглавление

Сообщения по теме [Сортировка по времени, UBB]


1. "malloc + free == утечка памяти"  
Сообщение от Forth (??) on 23-Янв-07, 17:39 
>Если сделать что то вроде этого
>
>char *ptr;
>
> while(1){
>   ptr = NULL;
>   ptr = malloc(250);
>   .....
>   .....
>   free(ptr);
> }
>
>то наблюдается некотораая "утечка памяти" :(
>
>Это так и должно быть или я что то неправильно делаю ?
>
Все конечно зависит от реализации malloc, но почти наверняка это расход памяти на внутренние структуры malloc, это нормально. Если конечно на месте многоточий нет еще какого-нибудь кода выделяющего память:))

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

2. "malloc + free == утечка памяти"  
Сообщение от Savva email(ok) on 23-Янв-07, 17:46 
>Все конечно зависит от реализации malloc, но почти наверняка это расход памяти
>на внутренние структуры malloc, это нормально. Если конечно на месте многоточий
>нет еще какого-нибудь кода выделяющего память:))

т.е. по любому придется мириться с эти безобразием?
не хотелось бы...

пишу небольшого демона который по идее должен работать без перезапуска минимум месяца 2-3...

написать хочется хорошо, что б не пришлось как то еще со стороны приглядывать за ним каким нить скриптом...

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

3. "malloc + free == утечка памяти"  
Сообщение от Forth (??) on 23-Янв-07, 17:59 
>написать хочется хорошо, что б не пришлось как то еще со стороны
>приглядывать за ним каким нить скриптом...
Вообще надо смотреть в malloc.c . Там и ответ на вопрос. Не думаю, что это утечка, скорее какая-то необходимость.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

4. "malloc + free == утечка памяти"  
Сообщение от Michelnok (ok) on 23-Янв-07, 18:13 
Эта "утечка" называется "фрагментация".

>пишу небольшого демона который по идее должен работать без перезапуска минимум месяца
>2-3...

Надо уменьшить до необходимого минимума количество malloc'ов во время обработки запросов к демону. В идеале таких malloc'ов не должно быть вообще - всю необходимую память лучше распределить при инициализации демона.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

5. "malloc + free == утечка памяти"  
Сообщение от Savva email(ok) on 23-Янв-07, 18:23 
>Эта "утечка" называется "фрагментация".

Фрагментация образуется даже если я каждый раз запрашиваю кусочек памяти фиксированного размера ?

и кстати ptr = realloc(ptr, 250) тоже не помогает :(

ну да ладно. постараюсь свести к статическим массивам. Уж лучше выделю статический с запасом, чем постоянно по чуть-чуть отхватывать буду.


а еще вопросец: можно как нить из самой программы на ЦЕ узнать сколько сейчас текущщий процесс занимает памяти ?

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

6. "malloc + free == утечка памяти"  
Сообщение от Michelnok (ok) on 23-Янв-07, 18:59 
>>Эта "утечка" называется "фрагментация".
>
>Фрагментация образуется даже если я каждый раз запрашиваю кусочек памяти
>фиксированного размера?

It depends...

>ну да ладно. постараюсь свести к статическим массивам. Уж лучше выделю статический
>с запасом, чем постоянно по чуть-чуть отхватывать буду.

С фиксированными размерами всё просто. Выделяешь вначале большой кусок, скажем на 1000 кусочков фиксированного размера. Выделяются и освобождаются кусочки оттуда элементарно (FIFO-список). Если первоначального большого куска не хватит, то выделяешь еще один по ходу. Освобождать большие куски как правило не имеет смысла - при следующем пике нагрузки все равно придется выделять.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

7. "malloc + free == утечка памяти"  
Сообщение от Michelnok (ok) on 23-Янв-07, 20:02 
>(FIFO-список)

LIFO, конечно же. Опечатался.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

8. "malloc + free == утечка памяти"  
Сообщение от BigHo on 24-Янв-07, 12:12 
действительно, есть утечка памяти, а есть выделение памяти на внутренние структуры. Одно от другого мало отличается при работе малыми количествами данных. Но если ваш процесс стал занимать раз в 100 больше памяти, чем это ему необходимо, то тут явно второе.

Утечка возникает не тогда, когда усиленно используется malloc, а тогда, когда забывают вызывать на более ненужный блок выделенной памяти функцию free.

В этом коде это возможно при использовании goto, continue, break.

Рекомендация по использованию слотов может иметь место, если выделяемая область памяти имеет четко ограниченные границы, ну или хотя бы находится в диапазоне до getpagesize() байт.

Вообщем все зависит от задачи.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

9. "malloc + free == утечка памяти"  
Сообщение от Savva email(ok) on 24-Янв-07, 12:23 
>Утечка возникает не тогда, когда усиленно используется malloc, а тогда, когда забывают
>вызывать на более ненужный блок выделенной памяти функцию free.
>
>В этом коде это возможно при использовании goto, continue, break.


ну я как то уже на 99.9% уверен в том что в остальном код без утечек (проверял как мог)

но интереса ради сейчас попробую тот минимальный код :)

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

10. "malloc + free == утечка памяти"  
Сообщение от Ф on 24-Янв-07, 13:09 
у 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;
}

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

11. "malloc + free == утечка памяти"  
Сообщение от Savva email(ok) on 24-Янв-07, 13:55 
Эмммм...... Сердечно прошу прощения, но при тестовых проверках именно моего же примера, получается, что
   malloc + free == все как надо


Видимо все таки не на то грешу...
Буду искать тот самый 0.01% (тот процент неуверенности что где то накосячил)


Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

12. "malloc + free == утечка памяти"  
Сообщение от Michelnok (ok) on 24-Янв-07, 15:30 
>Буду искать тот самый 0.01% (тот процент неуверенности что где то накосячил)

Да, конечно, фрагментация не возникнет на том примере что ты привел. Но в реальных условиях, когда память выделяется кусками разной длины и живущими разное время - вполне.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

13. "malloc + free == утечка памяти"  
Сообщение от Savva email(ok) on 24-Янв-07, 15:43 
>Да, конечно, фрагментация не возникнет на том примере что ты привел. Но
>в реальных условиях, когда память выделяется кусками разной длины и живущими
>разное время - вполне.

Это понятно.

Проблему локализовал в другом месте: Рекурсивная 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);
    }
}

эта гадость и пожирает память

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

14. "malloc + free == утечка памяти"  
Сообщение от Michelnok (ok) on 24-Янв-07, 16:04 
>буду стараться осмыслить, что б снова так не опозориться с глупым вопросом
>на весь опеннет

Полноте. Тут такие личности появляются, что тебе до них еще расти и расти :)

>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().

Обрати внимние на последнюю строку.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

15. "malloc + free == утечка памяти"  
Сообщение от Savva email(ok) on 24-Янв-07, 16:43 
>>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() то в них и не хватало.

да и дока у них уж больно мутно организована...
ну да ладно. теперь все работает.
спасибо за помосч!

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ] [Рекомендовать для помещения в FAQ]




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру