Кіріспе
Бағдарламалау идиомасы Ресурстарды алу – инициализациялау (RAII) – бірнеше объектіге бағытталған, статикалық типтегі бағдарламалау тілдерінде қолданылатын, белгілі бір тілдік мінез-құлықты сипаттауға арналған бағдарламалау идиомасы. RAII-де ресурсты ұстау – бұл сынып инварианты және объектінің өмір сүру мерзімімен байланысты. Ресурстарды бөлу (немесе алу) объектіні құру кезінде (әсіресе инициализациялау) конструктор арқылы, ал ресурстарды босату (шығару) объектіні жою кезінде (әсіресе түпкілікті жасау) деструктор арқылы жүзеге асырылады. Басқаша айтқанда, инициализация сәтті болуы үшін ресурстарды алу сәтті болуы керек. Осылайша, ресурс инициализация аяқталғаннан бастап, түпкілікті жасау басталғанға дейін (ресурсты ұстау – сынып инварианты) және объект тірі болған кезде ғана ұсталуы кепілдендіріледі. Егер объекттік ақаулар болмаса, ресурстық ақаулар да болмайды. RAII ең көп C++ тілінде қолданылады, сондай-ақ Ada, Vala және Rust тілдерінде де қолданылады. Бұл техника 1984–1989 жылдары C++-та қауіпсіз ресурстарды басқару үшін, негізінен Бьярн Строструп пен Эндрю Кенигтің еңбегімен әзірленді, ал терминнің өзі Строструппен енгізілді. Бұл идиоманың басқа атаулары – Құрастырушы алу, Жоюшы босату (CADRe) және қолданудың бір ерекше стилі – Масштабқа негізделген ресурстарды басқару (SBRM) болып табылады. Соңғы термин автоматты айнымалылардың ерекше жағдайына арналған. RAII ресурстарды объектінің өмір сүру мерзімімен байланыстырады, бұл ауқымға кіру мен шығумен сәйкес келмеуі мүмкін. (Атап айтқанда, еркін сақтауда бөлінген айнымалылардың өмір сүру мерзімі кез келген нақты ауқыммен байланысты емес.) Дегенмен, автоматты айнымалылар үшін RAII пайдалану (SBRM) – ең көп таралған қолдану жағдайы болып табылады.
Resource acquisition is initialization (RAII) is a programming idiom used in several object oriented, statically typed programming languages to describe a particular language behavior. In RAII, holding a resource is a class invariant, and is tied to object lifetime. Resource allocation (or acquisition) is done during object creation (specifically initialization), by the constructor, while resource deallocation (release) is done during object destruction (specifically finalization), by the destructor. In other words, resource acquisition must succeed for initialization to succeed. Thus the resource is guaranteed to be held between when initialization finishes and finalization starts (holding the resources is a class invariant), and to be held only when the object is alive. Thus if there are no object leaks, there are no resource leaks. RAII is associated most prominently with C++, where it originated, but also Ada, Vala, and Rust. The technique was developed for exception safe resource management in C++ during 1984–89, primarily by Bjarne Stroustrup and Andrew Koenig, and the term itself was coined by Stroustrup. Other names for this idiom include Constructor Acquires, Destructor Releases (CADRe) and one particular style of use is called Scope based Resource Management (SBRM). This latter term is for the special case of automatic variables. RAII ties resources to object lifetime, which may not coincide with entry and exit of a scope. (Notably variables allocated on the free store have lifetimes unrelated to any given scope.) However, using RAII for automatic variables (SBRM) is the most common use case.
Анықтамалық санау
Perl, Python (CPython нұсқасында) және PHP объектінің өмір сүру мерзімін сілтеме санау арқылы басқарады, бұл RAII-ды қолдануға мүмкіндік береді. Қайта қолданылмайтын объектілер дереу жойылады немесе түпкілікті өңделіп, босатылады, сондықтан деструктор немесе финализатор сол кезде ресурсты босата алады. Дегенмен, мұндай тілдерде бұл әрқашан қалыпты емес, ал Python-да тікелей ұсынылмайды (контексттік менеджерлер мен weakref пакетінен финализаторлардың пайдасына). Алайда, объектінің өмір сүру мерзімі міндетті түрде белгілі бір ауқыммен байланысты емес, объектілер детерминистік емес немесе толығымен жойылуы мүмкін. Бұл кейбір ауқым аяқталғанда босатылуы керек ресурстардың кездейсоқ түрде жоғалуына әкелуі мүмкін. Статикалық айнымалыда (әсіресе, жаһандық айнымалыда) сақталған объектілер бағдарлама аяқталғанда түпкілікті өңделмейді, сондықтан олардың ресурстары босатылмайды; мысалы, CPython мұндай объектілерді түпкілікті өңдеуге кепілдік бермейді. Сонымен қатар, дөңгелек сілтемелері бар объектілер қарапайым сілтеме санауымен жиналмайды және белгісіз мерзімге өмір сүреді; тіпті жиналған жағдайда да (күрделі қоқыс жинау арқылы), жою уақыты мен жою реті детерминистік болмайды. CPython-да циклдарды анықтайтын және циклдегі объектілерді түпкілікті өңдейтін цикл детекторы бар, бірақ CPython 3.4 нұсқасына дейін циклдегі кез келген объектте финализатор болса, циклдар жиналмайды.