# Aquisição de Recurso é Inicialização

Aquisição de Recurso é Inicialização (conhecido pelo acrônimo RAII para o termo em língua inglesa Resource Acquisition Is Initialization) é um padrão de projeto de software para C++, D e Rust que combina a aquisição e liberação de recursos com inicialização e destruição de objetos.
Segundo a RAII, o uso de memória de um objeto inicia-se na sua declaração, e termina quando o objeto sai do escopo, seja porque a execução chegou ao final do bloco, ou porque uma exceção foi lançada. A liberação de memória é possível através do uso dos métodos destrutores da classe – a liberação da memória no destrutor garante que ela será realizada em qualquer caminho que o fluxo seguir, tornando o código seguro.

## Exemplo
### Alocação dinâmica de memória

Usualmente em C++, quando se é necessário alocar um array e outros objetos de forma dinâmica, isto é, durante a execução do programa, o operador new é utilizado para realizar a alocação de memória (que no contexto de RAII é um recurso), enquanto o operador delete é utilizada para a desalocação, como no exemplo abaixo:
Caso a desalocação com o operador delete não seja realizada após o uso da variável array ter sido encerrado, a memória alocada inicialmente com o operador new permanecerá alocada até o término da execução do programa, pois C++ não contém um coletor de lixo (em inglês: garbage collector) por padrão; este fenômeno é conhecido como vazamento de memória (em inglês: memory leak). Múltiplas ocorrências de vazamento de memória, sobretudo em estruturas de repetição (tais como for e while), podem eventualmente esgotar a memória do sistema conforme a aplicação é executada, levando a diminuição do desempenho e a falhas. O fenômeno é demonstrado no exemplo abaixo:
Para solucionar este problema através do RAII, é possível encapsular e abstrair um array alocado dinamicamente através de uma classe RaiiArray cujo construtor RaiiArray(std::size_t tamanho) e destrutor ~RaiiArray realizem a alocação e desalocação da memória necessária, respectivamente. Similar ao comportamento de um ponteiro inteligente, a alocação é realizada quando a classe é instanciada através do construtor, e a desalocação ocorre automaticamente pelo destrutor quando a execução do programa atinge o fim do escopo onde o objeto se encontra, como demonstrado no exemplo abaixo. O operador foi incluído para que o acesso aos índices do array seja feito de maneira similar a forma convencional.
Através do uso de templates, a classe acima poderia ser generalizada para um tipo genérico qualquer, como demonstrado abaixo:
É importante citar que a biblioteca padrão do C++ moderno fornece alternativas RAII melhores para alocação dinâmica de memória, como std::vector, std::unique_ptr, std::shared_ptr e std::weak_ptr.

### Arquivo

A classe abaixo encapsula chamadas do gerenciamento de arquivos da biblioteca padrão do C usando RAII:
Pode-se usar a classe acima da seguinte forma:
A essência do idioma RAII é que a classe arquivo encapsula o gerenciamento do recurso FILE*, adquirindo e liberando automaticamente a memória, sem que seja necessário se preocupar com isso.

## Uso e alternativas em outras linguagens

Objetos Java são destruídos automaticamente em tempos indeterminados pelo coletor de lixo. Os recursos então devem ser manualmente fechados pelo programador. O exemplo anterior deve ser escrito da seguinte maneira em Java:
A responsabilidade de liberar o recurso recai sobre o programador em cada ponto onde o recurso é usado, e não de forma genérica em um local único.