The OpenNET Project / Index page

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

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

"Рост программы в памяти"
Сообщение от Brick Искать по авторуВ закладки(??) on 09-Авг-04, 14:17  (MSK)
Добрый день.

Подскажите, пожалуйста, почему данная функция при переодическом выполнении вызывает рост программы в памяти и каким образом это можно исправить.

/////////////////////////////////////////////////////////////////
long getRuleCount(const char *id)
{
   static int s = -1;      /* the socket */

   struct ip_fw *r;

#define NEXT(r) ((struct ip_fw *)((char *)r + RULESIZE(r)))

   int seen = 0, nbytes;
   long bytes = 0;
   u_long rnum;
   char rule[7];

   int nalloc = 1024;   /* start somewhere... */


   /* get rules or pipes from kernel, resizing array as necessary */
   nbytes = nalloc;

   if (s == -1)
      s = socket(AF_INET, SOCK_RAW, IPPROTO_RAW);
   if (s < 0)
      send_error("socket error(IPFW)");

   r = NULL;

   while (nbytes >= nalloc)
   {
      nalloc = nalloc * 2 + 200;
      nbytes = nalloc;

      if ((r = (ip_fw*)realloc(r, nbytes)) == NULL)
      {   }

   sprintf(rule, "%s%s", (IPFW_PREFIX), id);
   rnum = atoi(rule);

   for (int n = seen = 0; n < 65535, r->rulenum <= rnum; n++, r = NEXT(r))
   {
      if (r->rulenum == rnum)
      {
         bytes += (long)r->bcnt;
         seen = 1;
      }
   }

   if (!seen)
   {
      char err[50];
      sprintf(err, "Rule %lu does not exist", rnum);
      send_error(err);

      return -1;
   }

#undef NEXT


   return bytes;
}
         send_error("Error on realloc (IPFW)");

         return -1;
      }

/////////////////////////////////////////////////////////////////

  Рекомендовать в FAQ | Cообщить модератору | Наверх

 Оглавление

Индекс форумов | Темы | Пред. тема | След. тема
Сообщения по теме

1. "Рост программы в памяти"
Сообщение от Vladislav Lazarenko emailИскать по авторуВ закладки on 10-Авг-04, 12:59  (MSK)
>Добрый день.
>
>Подскажите, пожалуйста, почему данная функция при переодическом выполнении вызывает рост программы в
>памяти и каким образом это можно исправить.
>
>/////////////////////////////////////////////////////////////////
>long getRuleCount(const char *id)
>{
>   static int s = -1;    
> /* the socket */
>
>   struct ip_fw *r;
>
>#define NEXT(r) ((struct ip_fw *)((char *)r + RULESIZE(r)))
>
>   int seen = 0, nbytes;
>   long bytes = 0;
>   u_long rnum;
>   char rule[7];
>
>   int nalloc = 1024;   /* start somewhere...
>*/
>
>
>   /* get rules or pipes from kernel, resizing array
>as necessary */
>   nbytes = nalloc;
>
>   if (s == -1)
>      s = socket(AF_INET, SOCK_RAW, IPPROTO_RAW);
>   if (s < 0)
>      send_error("socket error(IPFW)");
>
>   r = NULL;
Тут мы проинициализировали указатель нулевым значением ...

>
>   while (nbytes >= nalloc)
>   {
>      nalloc = nalloc * 2 +
>200;
>      nbytes = nalloc;
>
>      if ((r = (ip_fw*)realloc(r, nbytes)) ==
>NULL)
>      {   }
>
Тут конечно все грязно, без обработки ошибок, но .. Тут ты выделяешь динамическую память, если указатель будет нулевым, или перевыделяешь память, если указатель ен нулевой ... Как результат - выделенная динамическая память ...

>   sprintf(rule, "%s%s", (IPFW_PREFIX), id);
>   rnum = atoi(rule);
>
>   for (int n = seen = 0; n < 65535, r->rulenum <= rnum; n++, r = NEXT(r))
>   {
>      if (r->rulenum == rnum)
>      {
>         bytes += (long)r->bcnt;
>         seen = 1;
>
>      }
>   }
>
>   if (!seen)
>   {
>      char err[50];
>      sprintf(err, "Rule %lu does not exist",
>rnum);
>      send_error(err);
>
>      return -1;
>   }
>
>
>
>#undef NEXT
>
>
>   return bytes;
>}
>         send_error("Error on realloc
>(IPFW)");
>
>         return -1;
>      }
>
>/////////////////////////////////////////////////////////////////


Которую ты нигде не освободил.

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

Исправляй, man free. Творческих тебе узбеков :)

  Рекомендовать в FAQ | Cообщить модератору | Наверх

2. "Рост программы в памяти"
Сообщение от Brick Искать по авторуВ закладки(??) on 10-Авг-04, 13:54  (MSK)
Пробовал free(r):
a.out in free(): error: pointer to wrong page
Abort trap (core dumped)
я ведь смещаю указатель в цыкле и оно, видимо не знает чего высвобождать, пробовал не смещать (неработоспособный вариант) всё-равно память растёт... :(
  Рекомендовать в FAQ | Cообщить модератору | Наверх

3. "Рост программы в памяти"
Сообщение от Brick Искать по авторуВ закладки(??) on 10-Авг-04, 13:58  (MSK)
исправляюсь: если не смещать указатель - память дружелюбно высвобождается и роста нет, как мне её высвободить в этом случае???
  Рекомендовать в FAQ | Cообщить модератору | Наверх

4. "Рост программы в памяти"
Сообщение от Vladislav Lazarenko emailИскать по авторуВ закладки on 10-Авг-04, 14:02  (MSK)
>исправляюсь: если не смещать указатель - память дружелюбно высвобождается и роста нет,
>как мне её высвободить в этом случае???

Конечно освобождения "левого" указателя ничего не даст. Перед тем, как смешать r, сохрани его копию. Например:

void *copy_of_r = (void *)r;

И перед возвратом управления:

free(copy_of_r);

....

удачи.

  Рекомендовать в FAQ | Cообщить модератору | Наверх

5. "Рост программы в памяти"
Сообщение от Brick Искать по авторуВ закладки(??) on 10-Авг-04, 14:03  (MSK)
Всё спасибо, разобрался: перед цыклом, где был перебор правил надо было обьявить новый указатель, типа: struct ip_fw *rul = r;
  Рекомендовать в FAQ | Cообщить модератору | Наверх

6. "Рост программы в памяти"
Сообщение от Vladislav Lazarenko emailИскать по авторуВ закладки on 10-Авг-04, 14:04  (MSK)
>Всё спасибо, разобрался: перед цыклом, где был перебор правил надо было обьявить
>новый указатель, типа: struct ip_fw *rul = r;


Вообще загляни в ipfw.c ... Там есть прекрасный пример перебора правил брандмауэра)))

  Рекомендовать в FAQ | Cообщить модератору | Наверх

7. "Рост программы в памяти"
Сообщение от Brick Искать по авторуВ закладки(??) on 11-Авг-04, 10:17  (MSK)
>>Всё спасибо, разобрался: перед цыклом, где был перебор правил надо было обьявить
>>новый указатель, типа: struct ip_fw *rul = r;
>
>
>Вообще загляни в ipfw.c ... Там есть прекрасный пример перебора правил брандмауэра)))
>
я оттуда и взял ;)


  Рекомендовать в FAQ | Cообщить модератору | Наверх


Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Пожалуйста, прежде чем написать сообщение, ознакомьтесь с данными рекомендациями.




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

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