URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 1877
[ Назад ]

Исходное сообщение
"Свободу памяти!"

Отправлено forfreeuse , 15-Июл-03 17:02 
День добрый.

Возник вопрос:
1. Есть main и есть подфункция в проге.
2. Подфункция имеет свои переменные, соотвественно под них выделяеться память.

Освобождаеться ли эта память после того, как подфункция отработает?

Вот пример:
#include <stdio.h>

void mem(void)
{
  int i;
  char mas[999999];
  for (i=0;i<999999;i++)
  mas[i]=33;
  sleep(1);
  system("ps aux| grep ./mem2 >>report");
}

void main (void)
{
sleep(1);
system("ps aux| grep ./mem2 >>report");
mem();
sleep(1);
system("ps aux| grep ./mem2 >>report");
}

вот репорт:
root     10384  0.0  0.0  1332  236 pts/2    S    16:54   0:00 ./mem2
root     10384  0.5  0.1  2312 1264 pts/2    S    16:54   0:00 ./mem2
root     10384  0.3  0.1  2312 1264 pts/2    S    16:54   0:00 ./mem2

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

PS: про malloc и free я знаю
PSS: gcc-3.2.2


Содержание

Сообщения в этом обсуждении
"Свободу памяти!"
Отправлено SalieFF , 15-Июл-03 17:20 
Не страдай. Все автоматические переменные (включая массивы) уничтожаюцца при выходе из области видимости. А что там у тебя ps рисует, ты на то не смотри. Ведь существует еще менеджер памяти в операционке, и график раздачи памяти, производимой им, совсем не линеен и несколько инерционен, потому что он пытаецца занимацца предварительной резервацией на основе анализа и предсказаний ;) Опять же тут куча заблуд со свопами, шарами, и прочим.

"Свободу памяти!"
Отправлено forfreeuse , 16-Июл-03 14:20 
Да, но если сделать то же самое с малок и фри, то ps отображает все нормально.

root      4599  0.1  0.0  1332  236 pts/2    S    14:14   0:00 ./mem2
root      4599  0.1  0.1  2312 1248 pts/2    S    14:14   0:00 ./mem2
root      4599  0.1  0.0  1332  268 pts/2    S    14:14   0:00 ./mem2

void mem(void)
{
int i;
char *mass;
mass=malloc(sizeof(char)*999999);

for (i=0;i<999999;i++)
mass[i]=33;
sleep(10);
system("ps aux| grep ./mem2 >>report");
free(mass);
}

void main (void)
{
sleep(10);
system("ps aux| grep ./mem2 >>report");
mem();
sleep(10);
system("ps aux| grep ./mem2 >>report");

}


"Свободу памяти!"
Отправлено SalieFF , 21-Июл-03 16:10 
Ну таков механизм malloc/free. Что ж тебя это так беспокоит-то? Запусти 1ый вариант проги в условиях ~150% memuse, там тоже вся резервация мигом прооптимизируется скорее всего, как и во 2ом варианте. Или ртфм гцц на предмет управления распределением автоматических переменных при компиляции...
Просто alloc/free - это явная работа с динамической памятью - тут хрен что предскажешь. А когда у тебя есть функция в которой резервируется автоматический массив, то место для этого массива после 1ого использования (если памяти хватает) на всякий случай закрепляецца за процессом (точнее этот массив даже реально не уничтожаецца, попробуй при повторном вызове фции перед заполнением выведи значения внутри этого массива, скорее всего увидишь те же "33" ;))), мож ты еще раз эту фцию вызовешь, тогда выделение этого массива на старое место произойдет гораздо быстрее, чем все по-новой.
В мире сущвуют тучи серверов, юзающих автоматические массивы в фциях. Я думаю, что если бы такой подход приводил к мемори ликам, то все бы они давно лежали, а не работали годами аптайма ;)
Если тебя все это жутко инетересует, то проботай директивы гцц по оптимизации переменных (volatile, etc...), ключи компиляции, относящиеся к этой области и механизм работы VMM (virtual memory manager). Но смею тебя заверить, что если ты не делаешь ПО к какой-нть экзотической железке, а просто пишешь прикладные проги для PC, то дефолтное поведение проги-компилятора-ОСи в 99.9% являецца самым оптимальным.