Ada_Ru форум

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

Re: [ada_ru] Высвобождениепамяти.

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

Сообщения

Sergey I. Rybin
Re: [ada_ru] Высвобождениепамяти.
2007-07-12 07:42:17

Alexey Veselovsky wrote:

 

 

 

Поковырялся вот с Адой, всё хорошо, за исключением одного НО: стандарт Ады не

регламентирует обязательное наличие автоматической сборки мусора.

С точки зрения Адской философии - это вполне нормально. (Можно по этому

поводу развести дискуссию, если интересно)

 

Более того - в

GNAT её вроде как и нету.

Зато есть gnatmem - инструмент для поиска утечек динамической памяти.

 

Как быть? Я что-то пропустил?

 

Возможно, две вещи будут полезны:

 

1. Контролируемые типы - можно самому запрограммировать освобождение

памяти, так, как оно надо.

 

2. Контейнеры - существенно уменьшают потребность в самопальных

динамических структурах (контейнеры память освобождают аккуратно)

Sergey I. Rybin wrote:

 

> Более того - в

> GNAT её вроде как и нету.

 

Зато есть gnatmem - инструмент для поиска утечек динамической памяти.

 

Есть ещё valgrind - значительно более универсальный инструмент поиска не только утечек памяти, но и иных сопутствующих проблем.

 

Есть ещё экзотическая возможность объявления ссылочного типа внутри декларативного блока подпрограммы - тогда по выходу из подпрограммы вся память, выделенная через этот ссылочный тип автоматически будет освобождена.

 

PS. Если покопаться на сайтах AdaWorld и AdaPower наверняка можно найти самые различные реализации Smart_Pointers.

 

Ещё один вариант реализации можно найти в PolyORB, пакет polyorb-smart_pointers.ad[sb]

С точки зрения Адской философии - это вполне нормально. (Можно по этому

поводу развести дискуссию, если интересно)

Интересно.

 

Более того - в

GNAT её вроде как и нету.

Зато есть gnatmem - инструмент для поиска утечек динамической памяти.

Это да, но утечки могут иметь место не всегда, т.е. не при любых

начальных условиях, не во всех ветвях алгоритма и т.п. Не все

получается протестировать... Ну и вообще - болезнь чаще легче

предупредить чем потом лечить.

 

> Как быть? Я что-то пропустил?

Возможно, две вещи будут полезны:

1. Контролируемые типы - можно самому запрограммировать освобождение

памяти, так, как оно надо.

Я правильно понял, что это сильно схоже с конструкторами/деструкторами

классов/структур в С++ (за исключением Adjust, в С++ для этого надо

переопределять operator=)?

 

2. Контейнеры - существенно уменьшают потребность в самопальных

динамических структурах (контейнеры память освобождают аккуратно)

Да, стандартные контейнеры сильно облегчают жизнь. В т.ч. и в С++.

 

А нету ничего аля умных указателей из С++ boost'a?

Alexey Veselovsky wrote:

 

Возможно, две вещи будут полезны:

1. Контролируемые типы - можно самому запрограммировать освобождение

памяти, так, как оно надо.

 

Я правильно понял, что это сильно схоже с конструкторами/деструкторами

классов/структур в С++ (за исключением Adjust, в С++ для этого надо

переопределять operator=)?

 

Ну да, а Adjust от переопределения "=" отличается лишь по форме,

а не по сути.

Vadim Godunko wrote:

 

Sergey I. Rybin wrote:

 

Более того - в

GNAT её вроде как и нету.

 

Зато есть gnatmem - инструмент для поиска утечек динамической памяти.

Есть ещё valgrind - значительно более универсальный инструмент поиска не только утечек памяти, но и иных сопутствующих проблем.

 

Есть ещё экзотическая возможность объявления ссылочного типа внутри декларативного блока подпрограммы - тогда по выходу из подпрограммы вся память, выделенная через этот ссылочный тип автоматически будет

освобождена.

 

Насколько я помню, ничего подобного в C++ нету

 

 

PS. Если покопаться на сайтах AdaWorld и AdaPower наверняка можно найти самые различные реализации Smart_Pointers.

 

Ещё один вариант реализации можно найти в PolyORB, пакет

polyorb-smart_pointers.ad[sb]

 

смарт указатели в Ада можно реализовывать быстро, и под свои нужды. Стандартизировать их как элемент рантайма несколько проблематично, потому что много вариантов может быть.

В прицепе один из возможных примеров.

> Есть ещё экзотическая возможность объявления ссылочного типа внутри

> декларативного блока подпрограммы - тогда по выходу из подпрограммы вся

> память, выделенная через этот ссылочный тип автоматически будет

> освобождена.

>

Насколько я помню, ничего подобного в C++ нету

Да, этого действительно нету. Поэтому у меня были некоторе проблемы с

понимаением сего механизма.

 

Я правильно понял, что такое высвобождение памяти (автоматическое)

годится только для процедур и функций?

 

смарт указатели в Ада можно реализовывать быстро, и под свои нужды.

Стандартизировать их как элемент рантайма несколько проблематично,

потому что много вариантов может быть.

Ну, зачем же рантайма? Как элемент стандартной библиотеки.

 

В прицепе один из возможных примеров.

Спасибо. Буду разбираться.

Alexey Veselovsky wrote:

 

Я правильно понял, что такое высвобождение памяти (автоматическое)

годится только для процедур и функций?

 

Ну да - классическая блочная структура. Подпрограмма = блок. Вызвал -

отвел память (в том числе и для кучи). Вернулся - освободил память.

 

А для чего еще это нужно может быть?

 

Спасибо. Буду разбираться.

 

Удачи :)

Alexey Veselovsky wrote:

Есть ещё экзотическая возможность объявления ссылочного типа внутри декларативного блока подпрограммы - тогда по выходу из подпрограммы вся память, выделенная через этот ссылочный тип автоматически будет

освобождена.

 

 

Насколько я помню, ничего подобного в C++ нету

 

Да, этого действительно нету. Поэтому у меня были некоторе проблемы с понимаением сего механизма.

 

Я правильно понял, что такое высвобождение памяти (автоматическое) годится только для процедур и функций?

 

Можно и для begin end блоков. если в declare этого блока объявить тип указателья на чего бы то ни было.

распределять там его сколько угодно через new, потом по выходу из этого блока вся распределенная память освободится.

смарт указатели в Ада можно реализовывать быстро, и под свои нужды. Стандартизировать их как элемент рантайма несколько проблематично, потому что много вариантов может быть.

 

Ну, зачем же рантайма? Как элемент стандартной библиотеки.

 

Под Ada runtime и подразумевается стандартная библиотека.

Я так понимаю.

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

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