Когда выделяются переменные типа доступа, выпущенные на языке Ada? - PullRequest
0 голосов
/ 12 июня 2018

Я читаю об Аде access types и, насколько я понимаю, объекты access types, которые вы выделяете с помощью оператора new, освобождаются, когда на них больше никто не указывает:

Итак, типы доступа в Ada ведут себя точно так же, как std::shared_ptr в C ++?(Помимо ограничений, связанных с указателями Ada, которых нет в C ++)

EDIT

Когда я говорю std::shared_ptr, я имею в виду, что объект освобождается, когда на него больше нет переменных, указывающих на них..

Ответы [ 2 ]

0 голосов
/ 13 июня 2018

Нет, указатели Ada (на практике) в значительной степени неуправляемы, как простые указатели C / C ++.Как говорит ответ Джейкоба, это вариант реализации компилятора, которого я не видел на практике.

Разница, которую я знаю, заключается в том, что для локально типа указателя вы получаете память извсе объекты типа возвращаются, когда тип , а не указатель, выходит из области видимости.Но эти указатели редко бывают полезными (они могут быть для очень локализованных алгоритмов, но не для долгоживущих структур).

Для указателей a-la std :: shared_ptr вам нужно будет развернуть собственную реализацию или выполнить поиск длякакая-то библиотека Ada (вероятно, GNATCOLL.Refcount - совпадение).

0 голосов
/ 12 июня 2018

Компиляторам разрешено реализовывать сборку мусора, но я не знаю ни одного компилятора, который на самом деле это делает (кроме некоторых пользовательских сборок GNAT).

Вам придется подождатьчтобы пройти мимо программиста C ++, чтобы получить сравнение с std::shared_ptr из C ++.

Если вы хотите убедиться, что объект, выделенный в пуле хранения (в куче), освобожден, вы используете Ada.Unchecked_Deallocation.

...