Ada_Ru форум

Обсуждение языка Ада

Освободить память

Оставить новое сообщение

Сообщения

Olga Dolbilina
Освободить память
2005-11-20 08:58:10

Здравствуйте !

Вопрос у меня:

 

Есть такая конструкция:

 

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-м :>

 

Эээ, в шестнадцатый раз повторяю - в стандарте это *уже* есть.

 

ВФ.

sve

 

----- Original Message -----

From: "Vladyslav Kozlovskyy" <dbdeveloper@...>

To: <ada_ru@yahoogroups.com>

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:

 

Ада преимущественно используется в

государственной/правительственной сфере.

Это абсолютно не так. Причем - уже очень давно.

Новое сообщение:
Страницы: 1 2

Чтобы оставить новое сообщение необходимо Зарегистрироваться и Войти