RAII = Приобретение Ресурса является Инициализация
Касательно подсчета = "GC бедного человека"
Вместе, они довольно мощны (как касательно - считал 3D объект, содержащий VBO, который он бросает, освобождает, когда это - деструктор, назван).
Теперь, вопрос - RAII существует на каком-либо языке помимо C++? В частности, язык, который не позволяет указатель arithmetric / переполнение буфера?
PERL 5 имеет подсчет и деструкторов, которые гарантированы, когда все ссылки выпадают вне области действия, поэтому Raii доступен на языке, хотя большинство программистов Perl не используют термин.
и Perl 5 не выставляют необработанные указатели на код Perl.
Perl 6, однако, имеет настоящий сборщик мусора, и фактически позволяет переключаться сборщик мусора; Таким образом, вы не можете положиться на вещи, которые собираются в каком-либо конкретном порядке.
Я считаю, что Python и Lua используют ссылку.
D имеет RAII, но все еще имеет арифметику указателей :( Но, на самом деле, вы не обязаны его использовать. Пожалуйста, обратите внимание, что заставить D работать для меня было занозой в заднице, так что, пожалуйста, говорите с нами.
В то время как не совсем Raii, Python имеет с оператором , а C # имеет оператор .
PERL, Python (C), PHP и TCL относятся к ссылке и имеют механизмы для уничтожения объекта после его ссылочного отчета до нуля, что может произойти, как только переменная выходит из объем. Встроенные типы выделяются автоматически. Пользовательские классы имеют способ определить деструктор, который призван при выпуске.
Существуют некоторые краевые случаи: глобальные переменные могут не быть выпущены до тех пор, пока не могут быть выпущены конец и круговые ссылки, до конца (хотя PHP недавно не реализовал GC, который обрабатывает этот случай, и Python 2 добавлен детектор цикла).
Python (стандартный cpeython, а не варианты, как Jython, Nonalen Naight и Ironpython) использует ссылку для его объектов.
С этим он также имеет Raii и (в основном) детерминированную мусорную коллекцию. Например, это предполагается работать детерминистративно закрывающие файлы:
def a():
fp = open('/my/file', 'r')
return fp.read()
Примечание FP.close ()
никогда не вызывается. Как только FP
выходит из охвата, объект должен быть уничтожен . Тем не менее, есть некоторые случаи, когда детерминированная финализация не гарантируется, например, в том, что в
SYS.LAST_TRACEBACK
Сохраняет последнюю трассировку) , в то время как Python теоретически имеет детерминированную финализацию, лучше четко закрыть любые ресурсы, где можно исключить Как и Иорор или тому подобное) может привести к тому, чтобы объект остаться в жизни.