quarta-feira, 19 de abril de 2006

Idioma RAII em C++ (1)

Aproveito o curso de C++ que estou actualmente a leccionar para discutir algumas técnicas interessantes. Hoje apetece-me falar de RAII, ou seja Resource Aquisition Is Initialization, um idioma que pode fácilmente ser implementado em C++ e que pode resolver muitas dores de cabeça.

Quem vem do C já foi muitas vezes confrontado ao problema da libertação dos recursos, um exemplo clássico (em C++) será:


void my_func()
{
...
char *my_val=f();
...
delete my_val;
}

char *f()
{
...
char * res=new char;
return res;
}


Esta solução é pouco elegante e potencialmente perigosa: o utilizador de f() pode esquecer-se de libertar a memória gerando uma fuga de memória (memory leak).

A solução do problema passa pela utilização de uma classe que assegure a libertação automática da memória, ou seja o pointer passará a ser gerido por um objecto que libertará a memória no destructor, como este é chamado automáticamente deixa de ser necessário chamar manualmente o delete. Usando a livraria standard isto daria:

void my_func()
{
...
std::auto_ptr<char> my_val=f();
...
}

auto_ptr<char> f()
{
...
std::auto_ptr<char> res(new char);
return res;
}


Neste exemplo o destructor de auto_ptr é executado automáticamente no fim de my_func o que provoca a libertação da memória sem nenhuma intervenção do programador.