Avançar para o conteúdo principal

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.

Comentários

  1. Mas isto faz com que as minhas funções devolvam todas auto_ptr(s).
    Isto não torna o código mais dificil de ler ?.

    Deixa lá pensar... O destrutor do my_val é executado porque a variável sai de scope.

    Se usar auto_ptr como variáveis da classe fica ainda mais dificil de ler o programa pois o tipo de todas elas é auto_ptr.

    O auto_ptr é uma classe que tem um construtor que recebe um void * e que tem um destrutor que liberta o espaço apontado pelo que recebeu no construtor?

    De qualquer forma, neste caso também não é preciso destruir nada porque o destrutor de auto_ptr é executado quando é feito o delete ao objecto.

    ResponderEliminar
  2. Esclarecimentos avulsos:
    1) Só as funções que devolvem apontadores de memória dinamica devem devolver algum tipo de "smart pointer" de que o std::auto_ptr é um exemplo. Óbviamente que as funções podem continuar a devolver por valor, ou por referência.
    2) std::auto_ptr<T> é um template, o constructor recebe um T * e não um void * aliás essa é uma das vantagens de usar "smart pointers" pois aumenta a "type safety".
    3) A utilização de typedefs pode aumentar muito a lisibilidade do código se os std::auto_ptr<T> te dão urticária.

    ResponderEliminar
  3. Corrigi o post pois o blog tinha apagado os argumentos de template.

    ResponderEliminar

Enviar um comentário

Mensagens populares deste blogue

Backup automático de disco USB (pen drive)

Hoje em dia toda a gente tem uma pen drive para levar os seus ficheiros de um lado para o outro. E muitas vezes está lá trabalho importante. Mas impõe-se uma pergunta: o que acontece se se perde a pen drive ? Ou se esta se avaria? Quem é que faz backups regulares da pen drive ? Muito pouca gente! Pessoalmente tenho por hábito fazer um backup cerca de uma vez por semana. Quando o trabalho é muito, faço backup mais vezes. Mas já por duas vezes as avarias me fizeram perder as versões mais recentes. E isto chateia. Por isso aqui há uns dias decidi "coçar esta comichão" e resolver o problema de forma mais sistemática: arranjei maneira de fazer um backup automático cada vez que ligo a pen drive a um computador. (sim, eu sei que há software específico para isto, mas que querem, apeteceu-me fazer mais um) A receita é relativamente simples: um script (DOS batch file ) que faz o backup , um ficheiro de definição de autorun e já está. 1. O script de backup - Basta instalar, na roo...

Ideias sobre o ensino à distância em 2020

O processo de combate ao COVID-19 obriga a que todos repensem as suas actividades normais e um dos sectores mais afectados é o Ensino. Diz-se com frequência que o Ensino em Portugal continua no séc. XX, porque continua a depender quase totalmente de lápis, caneta, papel e livros. Entre os anos de 1965 e 1987, Portugal teve a  Telescola , um projecto de ensino à distância que tentava resolver a falta de professores do ciclo preparatório (5º e 6º anos) em locais remotos. Desde então, tanto quanto sabemos, não houve mais projectos de ensino à distância em larga escala. Retrospectivamente, talvez tenha sido um erro mas, enfim, são coisas fáceis de dizer à posteriori. O tele-ensino não é uma coisa nova e os constrangimentos tecnológicos de hoje são muito menores. Nada que se compare, por exemplo com a experiência School of the Air , existente na Austrália desde 1951, quando os miúdos podiam apenas falar com os professores por rádios alimentados a pedais. Foto: "Miss Molly Ferg...

Recém-licenciados das TI não sabem produzir sistemas de informação

Uma das conclusões mais chocantes do recente trabalho " Competências a reforçar na formação dos profissionais de TI em Portugal ", do Grupo de Trabalho das Competências, da ANETIE é que os recém-licenciados não sabem o suficiente sobre construção de interfaces nem sobre produção de informação . Não conheço estatísticas sobre esta matéria. Mas julgo que não estará muito longe da verdade a afirmação de que mais de 90% dos licenciados em cursos ligados às TI estarão envolvidos profissionalmente na produção ou exploração de Sistemas de Informação de Gestão. Isto é: bases de dados, formulários electrónicos, relatórios operacionais ou analíticos, troca de informação entre sistemas, etc.. Ora o que a ANETIE apurou junto dos seus associados é que entre as maiores lacunas encontradas nos licenciados do sector que se vão depois dedicar à engenharia de software, os conhecimentos sobre coisas básicas como écrans de entradas de dados e emissão de relatórios são extremamente baixos. Outr...