Здравствуйте !
Вопрос у меня:
Есть такая конструкция:
Elements : constant Names_Array
:= (new Wide_String'("Element1"),
new Wide_String'("Element2"),
new Wide_String'("Element3"));
Обьявляется локально в процедуре.
Вопрос: нужно ли освобождать память, выделенную через new? И как тогда это сделать?
Ольга.
Sergey I. Rybin пишет:
Olga Dolbilina wrote:
Здравствуйте !
Вопрос у меня:
Есть такая конструкция:
Elements : constant Names_Array
:= (new Wide_String'("Element1"),
new Wide_String'("Element2"),
new Wide_String'("Element3"));
Обьявляется локально в процедуре.
Вопрос: нужно ли освобождать память, выделенную через new? И как тогда это сделать?
Если есть хоть малейшее сомнение - память нужно освобождать всегда.
А как - так покомпонентно, а как же еще!
for J in Elements'Range loop
Free (Elements (J));
end loop;
Классическая засада - ссылка на массив ссылок. Там надо тоже
сначала по компонентам пройтись, а про это часто забывают.
Если написать, как Вы предлагаете, то компилятор ругается :
actual for "X" must be a variable
:-(.
Sergey I. Rybin пишет:
Olga Dolbilina wrote:
Здравствуйте !
Вопрос у меня:
Есть такая конструкция:
Elements : constant Names_Array
:= (new Wide_String'("Element1"),
new Wide_String'("Element2"),
new Wide_String'("Element3"));
Обьявляется локально в процедуре.
Вопрос: нужно ли освобождать память, выделенную через new? И как тогда это сделать?
Вот такое нашлось решенье:
procedure Free is new Ada.Unchecked_Deallocation .....
for J in Elements'Range loop
declare
Ref : Wide_String_Access := Elements (J);
begin
Free (Ref);
end;
end loop;
Только уж больно длинное.
Olga Dolbilina wrote:
Здравствуйте !
Вопрос у меня:
Есть такая конструкция:
Elements : constant Names_Array
:= (new Wide_String'("Element1"),
new Wide_String'("Element2"),
new Wide_String'("Element3"));
Обьявляется локально в процедуре.
Вопрос: нужно ли освобождать память, выделенную через new? И как тогда это сделать?
Если есть хоть малейшее сомнение - память нужно освобождать всегда.
А как - так покомпонентно, а как же еще!
for J in Elements'Range loop
Free (Elements (J));
end loop;
Классическая засада - ссылка на массив ссылок. Там надо тоже
сначала по компонентам пройтись, а про это часто забывают.
Thursday, October 20, 2005, 2:42:01 PM, пробежало в Ada-RU:
Если есть хоть малейшее сомнение - память нужно освобождать всегда.
Никак не могу врубится почему в GNATe еще нету гарбет колекшина. Нет социального заказа? Тяжело поверить, что такая классная штука никому из крутых заказчиков не нужна :( Разве им не нужен безлючный софт? Я вот считаю, что свалить рутину освобождения обьектов на
компилятор - очень даже удобно, а если нужен тонкий "тюнинт" - прагмы и еще раз прагмы :)
--
Best regards,
Vladyslav
Никак не могу врубится почему в GNATe еще нету гарбет колекшина. Нет
социального заказа? Тяжело поверить, что такая классная штука никому
из крутых заказчиков не нужна :( Разве им не нужен безлючный софт?
Я вот считаю, что свалить рутину освобождения обьектов на
компилятор - очень даже удобно, а если нужен тонкий "тюнинт" - прагмы
и еще раз прагмы :)
Чтобы врубиться, надо просто попытаться представить себе, как
такая "сборка мусора" будет работать. Как она будет отделять мусор
от не-мусора.
Сборки мусора нет не в GNAT'е - ее нет в языке. Точнее, нет в режиме
"по умолчанию". Если надо - так можно определить типы на основе Controlled
и сделать для них сборку мусора.
Sergey I. Rybin wrote:
>Никак не могу врубится почему в GNATe еще нету гарбет колекшина. Нет >социального заказа? Тяжело поверить, что такая классная штука никому >из крутых заказчиков не нужна :( Разве им не нужен безлючный софт? >Я вот считаю, что свалить рутину освобождения обьектов на
>компилятор - очень даже удобно, а если нужен тонкий "тюнинт" - прагмы >и еще раз прагмы :)
>Чтобы врубиться, надо просто попытаться представить себе, как
>такая "сборка мусора" будет работать. Как она будет отделять мусор >от не-мусора.
>Сборки мусора нет не в GNAT'е - ее нет в языке. Точнее, нет в режиме >"по умолчанию". Если надо - так можно определить типы на основе Controlled >и сделать для них сборку мусора.
Насколько я понял, сборка мусора, это когда память распределенная оператором new автоматически освобождается,
когда на нее нет ссылок. Использование же Finalize/Adjust для типов Controlled это не есть сборка мусора, это есть автоматические
деструкторы, которые тоже позволяют не заботится об освобождении памяти, если соотвественно унаследуешься, и что нужно определишь.
Чтобы врубиться, надо просто попытаться представить себе, как
такая "сборка мусора" будет работать. Как она будет отделять мусор от не-мусора.
В яве ведь как-то работает? И даже обойти ее никак нельзя. Значит можно подобное реализовать и в АДЕ?
Сборки мусора нет не в GNAT'е - ее нет в языке. Точнее, нет в режиме "по умолчанию". Если надо - так можно определить типы на основе Controlled и сделать для них сборку мусора.
Складывется такое мнение, что в стандарте сборка мусора планировалась по умолчанию. Потом, правда, с темы спрыгнули. Почему я так считаю? ARM 13.11.3
13.11.3 Pragma Controlled
1 Pragma Controlled is used to prevent any automatic reclamation of storage (garbage collection) for the objects created by allocators of a given access type.
Заметь - есть прагма ОТКЛЮЧАЮЩАЯ гарбет коллекшн для конкретного
обьекта а не включающая его. Стало быть предполагалось, что он будет включен всегда, кроме случаев использования этой прагмы
--
Best regards,
Vladyslav
Sergey I. Rybin wrote:
>Никак не могу врубится почему в GNATe еще нету гарбет колекшина. Нет >социального заказа? Тяжело поверить, что такая классная штука никому >из крутых заказчиков не нужна :( Разве им не нужен безлючный софт? >Я вот считаю, что свалить рутину освобождения обьектов на
>компилятор - очень даже удобно, а если нужен тонкий "тюнинт" - прагмы >и еще раз прагмы :)
>Чтобы врубиться, надо просто попытаться представить себе, как
>такая "сборка мусора" будет работать. Как она будет отделять мусор >от не-мусора.
Каждая переменная типа access. должна содержать ссылку на счетчик ссылок, который инкрементируется при копировании
и декрементируется при исчезновении копии. При обнулении счетчика ссылок, память освобождается. Очень просто.
Если написать, как Вы предлагаете, то компилятор ругается :
actual for "X" must be a variable
:-(.
Вы меня сегодня не слушайте - я вижу только половину буков и цифр! :(
Конечно, ругается - у Вас же константа! А зачем Вам ссылочная конастнта?
Это вещь бесполезная - можно сбоку влезть и все там напортить.
Складывется такое мнение, что в стандарте сборка мусора планировалась по умолчанию. Потом, правда, с темы спрыгнули.
С темы никто отнюдь не спрыгивал. Сборка мусора является необязательной для реализаций языка. Если она есть - прагма имеет смысл, если ее нет - не имеет. Вот и вся тайна.
На Ваш же исходный вопрос ответ таков - в наших планах реализация СМ стоит, но поскольку отсутствует оплаченный контракт на разработку этого улучшения, то в планах это будет стоять скорее всего неопределенно долго.
ВФ.
На Ваш же исходный вопрос ответ таков - в наших планах реализация СМ стоит, но поскольку отсутствует оплаченный контракт на разработку этого улучшения, то в планах это будет стоять скорее всего неопределенно долго.
Я это знаю - такая информация уже пробегала в конференции. Просто я не могу понять, почему подобная фича не важна корпоративным заказчикам? Повторюсь, это ведь дополнительный уровень безопасности и
стабильности. +Удешевление разработки (времени на отладку и выуживания блох)
А?
--
Best regards,
Vladyslav
почему подобная фича не важна корпоративным заказчикам?
Видимо надо полагать что она бы им может и не помешала, но очевидно не за дополнительные деньги :)
ВФ
Dmitriy Anisimkov wrote:
Каждая переменная типа access. должна содержать ссылку на счетчик ссылок, который инкрементируется при копировании
и декрементируется при исчезновении копии. При обнулении счетчика ссылок, память освобождается. Очень просто.
Бывает ещё сборка мусора mark&sweep.
Она более универсальна, помогает детектить и освобождать
циклические структуры. В отличие от подхода с подсчётом ссылок.
Вообще, приписав к слову deallocation слово unchecked,
Ada так и осталась в 70-х годах, вместе с PL/1, C/C++ и другими
хорошими языками тех времён.
Лечить пытаются, но окончательно так и не долечили -
http://adacl.sourceforge.net/pmwiki.php/Main/GarbageCollector
http://www.enyo.de/fw/software/gnat-gc/
В стандарт, думаю, внесут году в 2050-м :>
Thursday, October 20, 2005, 5:19:04 PM, пробежало в Ada-RU:
Лечить пытаются, но окончательно так и не долечили -
http://adacl.sourceforge.net/pmwiki.php/Main/GarbageCollector
http://www.enyo.de/fw/software/gnat-gc/
В стандарт, думаю, внесут году в 2050-м :>
А жаль. С включением в стандарт хорошего GC Ада мгновенно становиться в ряд (а то и на шаг впереди) с модерновыми языками типа D, C# и Java.
Кстати, D (Mars) имеет GC, хотя и является полностью компилирующим языком. Хороший пример для подражания.
--
Best regards,
Vladyslav
В стандарт, думаю, внесут году в 2050-м :>
Эээ, в шестнадцатый раз повторяю - в стандарте это *уже* есть.
ВФ.
----- Original Message -----
From: "Vladyslav Kozlovskyy" <dbdeveloper@...>
To: <[email protected]>
Sent: Thursday, October 20, 2005 5:11 PM
Subject: Re[2]: [ada_ru] Освободить память
>Я это знаю - такая информация уже пробегала в конференции. Просто я не >могу понять, почему подобная фича не важна корпоративным заказчикам? >Повторюсь, это ведь дополнительный уровень безопасности и
>стабильности. +Удешевление разработки (времени на отладку и выуживания >блох)
Мне кажется, что отсутствие заказа объясняется областью использования Ada - системы повышенной надежности, реального времени, встраиваемые системы и в большинстве случаев все это в одно и тоже время.
Ну и понятно, что системы на базе ГЦ
1) Очень реактивны и непредсказуемы - непонятно когда начнется сборка мусора и когда она кончится.
Даже РТ-жаба не использует ГЦ, но фрейм-аллокаторы или пулы.
2) Для достижения производительности сравнимой с не ГЦ реализациями, ГЦ реализация требует в 5-6 раз больше
оперативной памяти, а при нехватке таковой их производительность падает на 1, 2 порядка сильнее, чем в не ГЦ
случае. Page fault-ы опятьже и т.д. и т.п. Вот например здесь есть немного http://www.cs.umass.edu/~emery/pubs/04-17.pdf
3) В некоторых системах (в частности RT) вообще частоне работают с динамической памятью ВООБЩЕ. Тоже и в safety
critical системах. По моему Spark вообще не имеет средств для работы с динамической памятью.
Хотя если очень хочется ... есть ГЦ от Hans Boehm - а. Хотя консервативный, а не прецезионный. Т.е. трейсит весь RSS.
Г.н. Martin Krishcik даже использовал его в adacl
http://adacl.sourceforge.net, http://adacl.sourceforge.net/gc.html
Yahoo! Groups Links
Vasiliy Fofanov wrote:
>В стандарт, думаю, внесут году в 2050-м :>
Эээ, в шестнадцатый раз повторяю - в стандарте это *уже* есть.
В каком пункте ? (желательно приложить URL).
sve wrote:
>Я это знаю - такая информация уже пробегала в конференции. Просто я не >могу понять, почему подобная фича не важна корпоративным заказчикам? >Повторюсь, это ведь дополнительный уровень безопасности и
>стабильности. +Удешевление разработки (времени на отладку и выуживания >блох)
Ада преимущественно используется в
государственной/правительственной сфере. Где деньги на расходы
образуются несколько другим путём, чем в сфере бизнеса.
"Если мы не освоим выделенного миллиона в этом году,
нам не выделят миллион в следующем" :>
Мне кажется, что отсутствие заказа объясняется областью использования Ada - системы повышенной надежности, реального времени, встраиваемые системы и в большинстве случаев все это в одно и тоже время.
Ракета Ariane5, например :>
Ну и понятно, что системы на базе ГЦ
1) ...
2) ...
... Вот например здесь есть
немного http://www.cs.umass.edu/~emery/pubs/04-17.pdf
Хорошая работа. Она показывает, что системы автоматического
управления памятью сильно усовершенствовались за последние 30
лет, в отличие от систем с ручным/явным управлением памятью.
И что теперь рекомендуется сто раз подумать, прежде чем начинать новый проект и сознательно отказываться от автоматической сборки мусора.
3) В некоторых системах (в частности RT) вообще частоне работают с динамической памятью ВООБЩЕ. Тоже и в safety
critical системах. По моему Spark вообще не имеет средств для работы с динамической памятью.
Если не использовать динамическую память, безопасным и
предсказуемым будет любой язык. C/C++, например.
В каком пункте ?
4.8(15)
13.11.3
(желательно приложить URL).
У вас нет доступа к Руководству по языку? Интерееесно..... :)
Например здесь - http://www.adahome.com/rm95/
ВФ.
Wladimir Mutel wrote:
Ада преимущественно используется в
государственной/правительственной сфере.
Это абсолютно не так. Причем - уже очень давно.
Чтобы оставить новое сообщение необходимо Зарегистрироваться и Войти