The OpenNET Project / Index page

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

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

"освобождение памяти, функция  free();" 
Сообщение от BsDr Искать по авторуВ закладки(ok) on 27-Сен-05, 18:16  (MSK)
Здорово всем!!!
Меня интересует функция 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 то память не освобождается.
Вот такая "особенность"! Если кто-нибудь с этим сталкивался, то буду весьма благодарен за советы!
Спасибо!!!

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

 Оглавление

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

1. "освобождение памяти, функция  free();" 
Сообщение от Niam Искать по авторуВ закладки on 27-Сен-05, 18:27  (MSK)
>Здорово всем!!!
>Меня интересует функция 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 то память не освобождается.
>Вот такая "особенность"! Если кто-нибудь с этим сталкивался, то буду весьма благодарен
>за советы!
>Спасибо!!!

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

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

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

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

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

3. "освобождение памяти, функция  free();" 
Сообщение от enot Искать по авторуВ закладки(??) on 27-Сен-05, 18:58  (MSK)
> 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 заполняет байты а не инты

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

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

4. "освобождение памяти, функция  free();" 
Сообщение от Niam Искать по авторуВ закладки on 27-Сен-05, 19:06  (MSK)

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

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

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

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

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

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

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

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

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

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

5. "освобождение памяти, функция  free();" 
Сообщение от Darknode Искать по авторуВ закладки on 27-Сен-05, 19:15  (MSK)
>Здорово всем!!!
>Меня интересует функция 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 дает сигнал ядру скинуть указатели на память, чтоб этот кусок памяти могли другие использовать...

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

6. "освобождение памяти, функция  free();" 
Сообщение от Ghecko Искать по авторуВ закладки(ok) on 27-Сен-05, 20:56  (MSK)
>Причем тут освобождение памяти? юниксы да и не только, как мне всегда
>казалось не освобождают память...просто free дает сигнал ядру скинуть указатели на
>память, чтоб этот кусок памяти могли другие использовать...
Точно, память освобождается только после завершения приложения/процесса.
  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх

7. "освобождение памяти, функция  free();" 
Сообщение от BsDr Искать по авторуВ закладки(ok) on 28-Сен-05, 10:43  (MSK)
>>Причем тут освобождение памяти? юниксы да и не только, как мне всегда
>>казалось не освобождают память...просто free дает сигнал ядру скинуть указатели на
>>память, чтоб этот кусок памяти могли другие использовать...
> Точно, память освобождается только после завершения приложения/процесса.

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

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

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

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

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

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

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

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

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

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

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

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

13. "освобождение памяти, функция  free();" 
Сообщение от BsDr Искать по авторуВ закладки(ok) on 29-Сен-05, 18:07  (MSK)
>а как Вы вообще проверяете особожденна память или нет ?
>
>вкратце, популярно о работе 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м, не освобождая!
Всем спасибо за дискуссию!!!
  Удалить Правка | Высказать мнение | Ответить | Рекомендовать в FAQ | Cообщить модератору | Наверх


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

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




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

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