Форум программистов, компьютерный форум, киберфорум
Другие языки программирования
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/9: Рейтинг темы: голосов - 9, средняя оценка - 5.00
Модератор
 Аватар для Curry
5158 / 3495 / 536
Регистрация: 01.06.2013
Сообщений: 7,593
Записей в блоге: 9

[Ada] Когда освобождать память под динамически созданную задачу?

04.07.2015, 01:38. Показов 1940. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В книжке Гавва (п. 16.1.3) написано, что, если задачу создаём по new, то освобождать память надо самим через Ada.Unchecked_Deallocation . Но когда? Придумал только дожидаться циклическим опросом в вызывающем трэде T'Terminated, что, как то не очень. Может есть другие способы? К примеру, в Delphi тред сам за собой подчистить может.
Тест на Аде:
Кликните здесь для просмотра всего текста
T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
with Ada.Text_IO;            use Ada.Text_IO;
with Ada.Unchecked_Deallocation;
 
procedure Main is
    task type Task1 is
        entry SetNum (num: in Integer);
        entry Stop;
    end Task1;
    
    task body Task1 is
        n: Integer;
    begin
        accept SetNum (num: in Integer) do
            n:=num;
            Put_Line ("SetNum " & Integer'Image(n)); 
        end SetNum;
        
        accept Stop do
            null;
        end Stop;
        Put_Line ("Task " & Integer'Image(n) & " terminated"); 
    end Task1;
    
    type tPtr is access Task1;
    type ta is array (1..10) of tPtr;
    t : ta;
    procedure FreeTask is new Ada.Unchecked_Deallocation ( Object => Task1 ,
                                                           Name => tPtr ) ;
    c : character;
    tasks_wait: Boolean := true;
begin
    for i in t'Range loop
        t(i):= new Task1;
        t(i).SetNum(i);
    end loop;
    Get(c);
    for i in t'Range loop
        t(i).Stop;
    end loop;
    while tasks_wait loop
        delay 0.1;
        tasks_wait:=false;
        for i in t'Range loop
            if t(i) /= null then
                if t(i)'Terminated then
                    FreeTask(t(i));
                else
                    tasks_wait:=true;
                end if;
            end if;
        end loop;
    end loop;
    Put_Line ("END");
end Main;
p.s. Что можно сделать просто массив задач я знаю.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
04.07.2015, 01:38
Ответы с готовыми решениями:

Как и когда правильно освобождать динамически выделенную память?
Доброго времени суток! Задалась вопросом, заданным в заголовке темы "Как и когда правильно освобождать динамически выделенную...

Как на динамически созданную панель добавить динамически созданную кнопку?
Добрый день, у меня вопрос как на динамически созданную панель добавить динамически созданную кнопку. private void...

Заполнение структуры - стоит ли освобождать память под переменные
Здравствуйте! Пытаюсь сделать слеюдующее... Объядяю структуру такого типа: struct info { char *ext1; char *ext2; ...

5
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33421 / 21527 / 8240
Регистрация: 22.10.2011
Сообщений: 36,935
Записей в блоге: 12
04.07.2015, 03:12
Кто мешает сделать:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
with Ada.Text_IO; use Ada.Text_IO;
with Ada.Unchecked_Deallocation;
 
procedure Main is
   type Task_Type;
   type Task_Ptr is access Task_Type;
   
   task type Task_Type is
      entry SetNum (num : Integer);
      entry Stop (This : in out Task_Ptr);
   end Task_Type;
   
   procedure FreeTask is new Ada.Unchecked_Deallocation (Object => Task_Type,
                                                         Name => Task_Ptr);
   
   task body Task_Type is
      n : Integer;
   begin
      accept SetNum (num : Integer) do
         n := num;
         Put_Line ("SetNum " & Integer'Image (n)); 
      end SetNum;
      
      accept Stop (This : in out Task_Ptr) do
         FreeTask (This);
      end Stop;
      Put_Line ("Task " & Integer'Image (n) & " terminated"); 
   end Task_Type;
    
   type Task_Array is array (1 .. 10) of Task_Ptr;
   t : Task_Array;
   c : Character;
begin
   for i in t'Range loop
      t (i) := new Task_Type;
      t (i).all.SetNum (i);
   end loop;
   Get (c);
   for i in t'Range loop
      t (i).all.Stop (t (i));
   end loop;
   
   Put_Line ("END");
end Main;
?
1
Модератор
 Аватар для Curry
5158 / 3495 / 536
Регистрация: 01.06.2013
Сообщений: 7,593
Записей в блоге: 9
04.07.2015, 11:25  [ТС]
Цитата Сообщение от volvo Посмотреть сообщение
Кто мешает сделать:
То, что после освобождения памяти, задача ещё будет какое то время жить, и освобождённую память, до завершения задачи, может получить другая задача.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33421 / 21527 / 8240
Регистрация: 22.10.2011
Сообщений: 36,935
Записей в блоге: 12
04.07.2015, 11:32
Лучший ответ Сообщение было отмечено KolodeznyDiver как решение

Решение

Не может. Пока задача не закончится - память не будет освобождена. Как только память будет освобождена - задача завершится. Этот способ рекомендован разработчиками языка, если что, и представлен в доках на GNAT Pro.
1
Модератор
 Аватар для Curry
5158 / 3495 / 536
Регистрация: 01.06.2013
Сообщений: 7,593
Записей в блоге: 9
04.07.2015, 11:40  [ТС]
Цитата Сообщение от volvo Посмотреть сообщение
представлен в доках на GNAT Pro
Эти доки доступны? URL бы.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33421 / 21527 / 8240
Регистрация: 22.10.2011
Сообщений: 36,935
Записей в блоге: 12
04.07.2015, 12:16
Нет, эти доки закрыты, распространяются только с Pro-версией среды. Но... Достаточно посмотреть на исходники (файл \adainclude\s_tassta.adb, начиная с 941-ой строки), чтобы убедиться в том, как именно задача будет уничтожена. Ну и вот сюда можно заглянуть...
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
04.07.2015, 12:16
Помогаю со студенческими работами здесь

Dll на C++ кушает память, как правильно удалять и освобождать память?
Добрый день, совсем мало опыта в программировании на C++, помогите пожалуйста знатоки С++. Есть Dll, типа wrapper для библиотеки...

Динамически выделить память под массив
Задание было в следующем: дан вещественный двумерный массив А. Поменять местами максимальный элемент главной и побочной диагоналей с...

Динамически выделить память под массив
Добрый день форусчани Как можно выделить память под массив объекта класса class Save_Colection { public: pk *field; ...

Динамически выделить память под массив функций
QByteArray (SerfingThread::*lp_GetRequest)(const QByteArray& ,const QByteArray&); как сделать тоже самое только через new? как правильно...

Выделить память под двумерный массив динамически
Маюсь уже неделю, не могу выделить динамическую память под двумерный массив(чистый Си), чтобы на вход подавать файлы любого размера....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: показать затраченные материалы за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В качестве. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определённом условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru