The OpenNET Project / Index page

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

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

"Свободу памяти!"
Сообщение от forfreeuse emailИскать по авторуВ закладки on 15-Июл-03, 17:02  (MSK)
День добрый.

Возник вопрос:
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

  Рекомендовать в FAQ | Cообщить модератору | Наверх

 Оглавление

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

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

2. "Свободу памяти!"
Сообщение от forfreeuse emailИскать по авторуВ закладки on 16-Июл-03, 14:20  (MSK)
Да, но если сделать то же самое с малок и фри, то 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");

}

  Рекомендовать в FAQ | Cообщить модератору | Наверх

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


Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Пожалуйста, прежде чем написать сообщение, ознакомьтесь с данными рекомендациями.




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

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