- освобождение памяти, функция 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м, не освобождая! Всем спасибо за дискуссию!!!
|