Ponto V!

Home C/C++ Smart Pointers Boost Scoped Pointer (scoped_ptr)
Bruno Crivelari Sanches
Boost Scoped Pointer (scoped_ptr)Imprimir
Escrito por Bruno Crivelari Sanches

Para ver o tutorial anterior da série: Boost Weak Pointer

No tutorial anterior prometi falar sobre arrays, mas resolvi deixar para o próximo tutorial, pois dessa forma já posso incluir o scoped_array.

O Boost Scoped Pointer é uma versão bem simplificada de um smart pointer, que como o nome já diz depende do escopo. Ele é semelhante ao auto_ptr: quando seu destrutor é rodado, o ponteiro que este contém é deletado. A diferença é que o scoped_ptr não pode ser copiado e nem tem um método release (que libera o ponteiro). Ou seja, uma vez inicializado o scoped_ptr, ele se torna dono do ponteiro e vai deletar ele no final da sua vida.

Se o scoped_ptr não pode ser copiado, nem feito release, não pode ser usado com STL (essa não tinha dito ainda), então para que usar ele? Ele é útil quando precisamos alocar um objeto dinamicamente dentro de outro objeto ou quando precisamos de algo dinâmico dentro de algum escopo.

Por exemplo:

#include <boost/scoped_ptr.hpp>

int main(int, char **argv)
{

    boost::scoped_ptr<Person> p(new Person());
    p->SetName("Bruno");

    return(0);
}

Basicamente é o mesmo exemplo dos programas anteriores, a diferença é que o scoped_ptr, diferentemente do shared_ptr não precisa alocar um outro objeto para gerenciar contagem de referencias, dessa forma ele permite que qualquer compilador descente, consiga pegar o código acima e gerar:

int main(int, char **argv)
{
    Person *p(new Person);

    p->SetName("Bruno");
    delete p;

    return(0);
}

Ou seja, o scoped_ptr não tem custo algum em tempo de execução! Claro que o exemplo acima é bem simples, e o ideal seria criar a classe Person na pilha. Vamos tentar outro exemplo…

Imaginemos que temos um programa de processamento de imagens, e este programa possui uma classe para realizar operações com uma imagem, como imagens geralmente consomem muitos recursos, não é desejável que a classe de operações possua uma imagem como atributo, e como a imagem não vai ser compartilhada, podemos usar uma scoped_ptr:

#include <boost/scoped_ptr.hpp>
#include <string>

class Image
{
    public:
        int Load(const std::string &name)
        {
            //implementacao

            return 0;
        }
};

class ImageOperation
{
    public:
        int Load(const std::string &name)
        {
            m_image.reset(new Image());

            return(m_image->Load(name));
        }

    private:
        boost::scoped_ptr<Image> m_image;
};

int main(int argc, char **argv)
{
    ImageOperation op;

    op.Load("teste.bmp");

    return 0;
}

Nesse exemplo simples vimos que usando um scoped_ptr não precisamos nos preocupar mais com gerenciamento de ponteiros, pois o scoped_ptr garante que todo ponteiro armazenado por ele vai ser desalocado. Esta é uma dos smart pointers mais fáceis e práticos de se usar, inclusive para quem viu o Google C++ Style Guide, ele esta na lista de recomendações.

No próximo tutorial, vamos ver finalmente como lidar com arrays (o scoped_ptr também não serve para arrays).

Próximo tutorial da série: Boost Shared Array e Scoped Array


Comentários (0)
Escrever um comentário
Your Contact Details:
Gravatar enabled
Comentário:
[b] [i] [u] [url] [quote] [code] [img]   
:angry::0:confused::cheer:B):evil::silly::dry::lol::kiss::D:pinch::(:shock:
:X:side::):P:unsure::woohoo::huh::whistle:;):S:!::?::idea::arrow:
Security
Por favor coloque o código anti-spam que você lê na imagem.
LAST_UPDATED2  

Busca

Linguagens

Twitter