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