The OpenNET Project / Index page

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




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
освобождение памяти, функция  free();, !*! BsDr, 27-Сен-05, 18:16  [смотреть все]
Здорово всем!!!
Меня интересует функция free() в FreeBsd.
Ну что тут сложного, вызвал free() и все, например так:
temp.c:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    int *in;
    int a = 5;
    int b = 4;
    int c;
    in = malloc(30000000 * sizeof(int));
    memset(in, 1, 30000000);
    
    //printf("c: %i\n", a + b);
    
    sleep(15);
    free(in);
    printf("flag_2\n");
    sleep(100);
}
Такой вариант кода работает как есть: выделил, заполнил, освободил.
Если, например сложить а и b то память не освобождается.
Вот такая "особенность"! Если кто-нибудь с этим сталкивался, то буду весьма благодарен за советы!
Спасибо!!!

  • освобождение памяти, функция  free();, !*! Niam, 18:27 , 27-Сен-05 (1)
    >Здорово всем!!!
    >Меня интересует функция free() в FreeBsd.
    >Ну что тут сложного, вызвал free() и все, например так:
    >temp.c:
    >#include <stdio.h>
    >#include <stdlib.h>
    >#include <string.h>
    >
    >int main()
    >{
    > int *in;
    > int a = 5;
    > int b = 4;
    > int c;
    > in = malloc(30000000 * sizeof(int));
    > memset(in, 1, 30000000);
    >
    > //printf("c: %i\n", a + b);
    >
    > sleep(15);
    > free(in);
    > printf("flag_2\n");
    > sleep(100);
    >}
    >Такой вариант кода работает как есть: выделил, заполнил, освободил.
    >Если, например сложить а и b то память не освобождается.
    >Вот такая "особенность"! Если кто-нибудь с этим сталкивался, то буду весьма благодарен
    >за советы!
    >Спасибо!!!

    А причем здесь сложение?? Память и так и так должна освободится.

    • освобождение памяти, функция  free();, !*! BsDr, 18:53 , 27-Сен-05 (2)
      >А причем здесь сложение?? Память и так и так должна освободится.

      В том то и дело что нипречем, с вычитанием тоже не работет :)!
      Проблема в том что при выполнении каких-либо действий между выделением памяти и ее освобождением, освобождения собственно говоря не происходит.
      С коментарием работает. При сложении начинаются траблы, т.е. flag_2 появился функция заснула а памяти процесса не уменьшелось(смотрю вызовом top).

    • освобождение памяти, функция  free();, !*! enot, 18:58 , 27-Сен-05 (3)
      > in = malloc(30000000 * sizeof(int));
      Вообще так:
      in = (int *)malloc(30000000 * sizeof(int));
      // 30000000*4=120Мб на 32 разрядной машине....
      // 30000000*8=240Мб на 64 разрядной машине....

      И еще вот так:
      if (!in) {
         printf("Ну не могу выделить 120-240Мб памяти.. ну нету...\n")
         exit(1);
      }
      > memset(in, 1, 30000000);
      Это первые 30Мб из 120Мб.... прикольно ;-)
      memset заполняет байты а не инты

      Вот и я думаю, причем тут сложение....

      • освобождение памяти, функция  free();, !*! Niam, 19:06 , 27-Сен-05 (4)

        >> memset(in, 1, 30000000);
        >Это первые 30Мб из 120Мб.... прикольно ;-)
        >memset заполняет байты а не инты

        ну и что?? при вызове free не смотрит что заполнено, а что нет.

        попробуй заюзать calloc.
        в принципе это может быть связано со sleep. попробуй их заменить на операции ввода. scanf...
        и проследить ситуацию, пока будет ожидаться ввод.

        • освобождение памяти, функция  free();, !*! enot, 11:22 , 28-Сен-05 (8)
          >
          >>> memset(in, 1, 30000000);
          >>Это первые 30Мб из 120Мб.... прикольно ;-)
          >>memset заполняет байты а не инты
          >
          >ну и что?? при вызове free не смотрит что заполнено, а что
          >нет.
          >
          >попробуй заюзать calloc.
          >в принципе это может быть связано со sleep. попробуй их заменить на
          >операции ввода. scanf...
          >и проследить ситуацию, пока будет ожидаться ввод.

          Да, не смотрит. просто у автора число 30000000 в одном случае относится к выделению интов, в другом к заполнению байтами.
          видимо переписать надо так memset(in, 1, 30000000*sizeof(int));
          Только и всего.

          • освобождение памяти, функция  free();, !*! BsDr, 11:37 , 28-Сен-05 (10)
            >>
            >>>> memset(in, 1, 30000000);
            >>>Это первые 30Мб из 120Мб.... прикольно ;-)
            >>>memset заполняет байты а не инты

            >Да, не смотрит. просто у автора число 30000000 в одном случае относится
            >к выделению интов, в другом к заполнению байтами.
            >видимо переписать надо так memset(in, 1, 30000000*sizeof(int));
            >Только и всего.
            Не о том разговор: 116M - это выдеренной памяти 30192K - это занятой, так выходит!
            Провлема в освобождении!

  • освобождение памяти, функция  free();, !*! Darknode, 19:15 , 27-Сен-05 (5)
    >Здорово всем!!!
    >Меня интересует функция free() в FreeBsd.
    >Ну что тут сложного, вызвал free() и все, например так:
    >temp.c:
    >#include <stdio.h>
    >#include <stdlib.h>
    >#include <string.h>
    >
    >int main()
    >{
    > int *in;
    > int a = 5;
    > int b = 4;
    > int c;
    > in = malloc(30000000 * sizeof(int));
    > memset(in, 1, 30000000);
    >
    > //printf("c: %i\n", a + b);
    >
    > sleep(15);
    > free(in);
    > printf("flag_2\n");
    > sleep(100);
    >}
    >Такой вариант кода работает как есть: выделил, заполнил, освободил.
    >Если, например сложить а и b то память не освобождается.
    >Вот такая "особенность"! Если кто-нибудь с этим сталкивался, то буду весьма благодарен
    >за советы!
    >Спасибо!!!


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

    • освобождение памяти, функция  free();, !*! Ghecko, 20:56 , 27-Сен-05 (6)
      >Причем тут освобождение памяти? юниксы да и не только, как мне всегда
      >казалось не освобождают память...просто free дает сигнал ядру скинуть указатели на
      >память, чтоб этот кусок памяти могли другие использовать...
      Точно, память освобождается только после завершения приложения/процесса.
      • освобождение памяти, функция  free();, !*! BsDr, 10:43 , 28-Сен-05 (7)
        >>Причем тут освобождение памяти? юниксы да и не только, как мне всегда
        >>казалось не освобождают память...просто free дает сигнал ядру скинуть указатели на
        >>память, чтоб этот кусок памяти могли другие использовать...
        > Точно, память освобождается только после завершения приложения/процесса.

        На самом деле память ОСВОБОЖДАЕТСЯ:
        После заполнения (memset(...) ), памяти выделяется 116Мб.
        Затем по истечении 15 с под процесс уже выделенно 1472K, как это назвать как не освобождением.
        А при printf("c: %i\n", a + b); Как было 116Мб так и осталось 116Мб.

        • освобождение памяти, функция  free();, !*! enot, 11:30 , 28-Сен-05 (9)
          >>>Причем тут освобождение памяти? юниксы да и не только, как мне всегда
          >>>казалось не освобождают память...просто free дает сигнал ядру скинуть указатели на
          >>>память, чтоб этот кусок памяти могли другие использовать...
          >> Точно, память освобождается только после завершения приложения/процесса.
          >
          >На самом деле память ОСВОБОЖДАЕТСЯ:
          >После заполнения (memset(...) ), памяти выделяется 116Мб.
          >Затем по истечении 15 с под процесс уже выделенно 1472K, как это
          >назвать как не освобождением.
          >А при printf("c: %i\n", a + b); Как было 116Мб так и
          >осталось 116Мб.

          Вопрос к автору: проверку после malloc() сделал?
          Если да, и все равно падает - запускай отладку и т.п.

          ЗЫ: Жаль у мну FreeBSD под рукой нет..

          • освобождение памяти, функция  free();, !*! BsDr, 11:44 , 28-Сен-05 (11)
            >>>>Причем тут освобождение памяти? юниксы да и не только, как мне всегда
            >>>>казалось не освобождают память...просто free дает сигнал ядру скинуть указатели на
            >>>>память, чтоб этот кусок памяти могли другие использовать...
            >>> Точно, память освобождается только после завершения приложения/процесса.
            >>
            >>На самом деле память ОСВОБОЖДАЕТСЯ:
            >>После заполнения (memset(...) ), памяти выделяется 116Мб.
            >>Затем по истечении 15 с под процесс уже выделенно 1472K, как это
            >>назвать как не освобождением.
            >>А при printf("c: %i\n", a + b); Как было 116Мб так и
            >>осталось 116Мб.
            >
            >Вопрос к автору: проверку после malloc() сделал?
            >Если да, и все равно падает - запускай отладку и т.п.
            >
            >ЗЫ: Жаль у мну FreeBSD под рукой нет..

            Да делал: malloc() возвращает не NUUL.
            Заметил еще такую тему: если не пользоваться операциями ввода ввывода (пробовал как советовали с gethar()), просто сложить и не печатать, то все нолмально работает.

  • освобождение памяти, функция  free();, !*! MaximKuznetsov, 11:20 , 29-Сен-05 (12)
    а как Вы вообще проверяете особожденна память или нет ?

    вкратце, популярно о работе malloc/free в libc :
    - есть такая хрень "куча" - специальным образом размеченная память, принадлежащая процессу
    - malloc "выделяет память" то есть даст кусок памяти из кучи для ваших нужд. Если в куче нет достаточного куска памяти, то она обратится за ним к системе.
    - free "освобождает память" то есть помещает кусок памяти обратно в кучу. Заметте, что отнють не отдаёт обратно системе, а хранит для следующего использования.
    - правила по которым память будет возвращаться системе достатчно путанны, но еффективны.

    • освобождение памяти, функция  free();, !*! BsDr, 18:07 , 29-Сен-05 (13)
      >а как Вы вообще проверяете особожденна память или нет ?
      >
      >вкратце, популярно о работе malloc/free в libc :
      >- есть такая хрень "куча" - специальным образом размеченная память, принадлежащая процессу
      >
      >- malloc "выделяет память" то есть даст кусок памяти из кучи для
      >ваших нужд. Если в куче нет достаточного куска памяти, то она
      >обратится за ним к системе.
      >- free "освобождает память" то есть помещает кусок памяти обратно в кучу.
      >Заметте, что отнють не отдаёт обратно системе, а хранит для следующего
      >использования.
      >- правила по которым память будет возвращаться системе достатчно путанны, но еффективны.
      >
      Я уж, точно незнаю какие операции с памятью там происходят, но проблеммы как оказалось нет! На самом деле память освобождается!!!
      Только топ это не отображает:
      Простой пример:
      int main()
      {
          int *in;
          int i;
              
          for(i = 0; i < 10; i++)
              {
                  in = calloc(30000000, sizeof(int));
                  sleep(5);
                  //printf("i: %i\n", i);
                  free(in);
                  printf("i: %i\n", i);
                  sleep(5);
              }
      }
      5с- занята, 5с-свободна,
      Если снять комментарий то опять же,5с- занята, 5с-свободна вот только топ-у абсолютно по барабану: он как показывал 116м занятой так и показывает!
      Иначе бы машину бы просто скрючило, как если памяти выделить 10 раз по 116м, не освобождая!
      Всем спасибо за дискуссию!!!



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

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