Destruidor (programação de computador) - Destructor (computer programming)

Na programação orientada a objetos , um destruidor (às vezes abreviado como dtor ) é um método que é chamado mecanicamente pouco antes de a memória do objeto ser liberada. Isso pode acontecer quando seu tempo de vida está vinculado ao escopo e a execução deixa o escopo, quando é embutido em outro objeto cujo tempo de vida termina ou quando foi alocado dinamicamente e liberado explicitamente. Seu objetivo principal é liberar os recursos (alocações de memória, abrir arquivos ou sockets, conexões de banco de dados , bloqueios de recursos, etc.) que foram adquiridos pelo objeto durante sua vida e / ou cancelar o registro de outras entidades que possam manter referências a ele. O uso de destruidores é necessário para o processo de Aquisição de Recursos é Inicialização (RAII).

Com a maioria dos algoritmos de coleta de lixo automática , a liberação de memória pode acontecer muito tempo depois que o objeto se torna inacessível, tornando os destruidores (chamados de finalizadores neste caso) inadequados para a maioria dos propósitos. Nessas linguagens, a liberação de recursos é feita por meio de uma construção lexical (como try..finally, Python's "with" ou Java's "try-with-resources"), que é o equivalente a RAII, ou explicitamente chamando um função (equivalente à exclusão explícita); em particular, muitas linguagens orientadas a objetos usam o padrão Dispose .

Sintaxe destruidora

  • C ++ : os destruidores têm o mesmo nome da classe à qual estão associados, mas com um prefixo til (~).
  • D : os destruidores são declarados com o nome ~this() (enquanto os construtores são declarados com this() ).
  • Object Pascal : destruidores têm a palavra-chave destructor e podem ter nomes definidos pelo usuário, mas são principalmente nomeados Destroy .
  • Objective-C : o método destruidor tem o nome dealloc .
  • Perl : o método destruidor tem nome DESTROY ; na extensão do sistema de objetos Moose , é nomeado DEMOLISH .
  • PHP : No PHP 5+, o método destruidor tem nome __destruct . Não havia destruidores nas versões anteriores do PHP.
  • Python : existem __del__ métodos chamados destruidores pelo guia de linguagem Python 2, mas eles são na verdade finalizadores, conforme reconhecido no Python 3.
  • Ferrugem : o método destruidor da ferrugem tem o nome drop
  • Swift : o método destruidor tem o nome deinit .

Em C ++

O destruidor tem o mesmo nome da classe, mas com um til (~) antes dele. Por exemplo, uma classe chamada foo terá o destruidor . Além disso, os destruidores não têm parâmetros nem tipos de retorno. Conforme declarado acima, um destruidor para um objeto é chamado sempre que o tempo de vida do objeto termina. Se o objeto foi criado como uma variável automática , seu tempo de vida termina e o destruidor é chamado automaticamente quando o objeto sai do escopo. Como o C ++ não tem coleta de lixo, se o objeto foi criado com uma instrução (dinamicamente no heap ), seu destruidor é chamado quando o operador é aplicado a um ponteiro para o objeto. Normalmente, essa operação ocorre dentro de outro destruidor, normalmente o destruidor de um objeto de ponteiro inteligente . ~foo()newdelete

Nas hierarquias de herança, a declaração de um destruidor virtual na classe base garante que os destruidores das classes derivadas sejam chamados corretamente quando um objeto é excluído por meio de um ponteiro para a classe base. Os objetos que podem ser excluídos dessa maneira precisam herdar um destruidor virtual.

Um destruidor nunca deve lançar uma exceção.

Exemplo

#include <cstring>
#include <iostream>

class Foo {
public:
    Foo(): data_(new char[sizeof("Hello, World!")]) {
        std::strcpy(data_, "Hello, World!");
    }

    Foo(const Foo& other) = delete;             // disable copy construction
    Foo& operator=(const Foo& other) = delete;  // disable assignment

    ~Foo(void) { delete[] data_; }

private:
    friend std::ostream& operator<<(std::ostream& os, const Foo& foo) {
        os << foo.data_;
        return os;
    }

    char* data_;
};

int main() {
    Foo foo;
    std::cout << foo << std::endl;
}

Objetos que não podem ser copiados e / ou atribuídos com segurança devem ser desabilitados de tal semântica, declarando suas funções correspondentes como excluídas dentro de um nível de encapsulamento público. Uma descrição detalhada desse método pode ser encontrada no popular livro de Scott Meyers , Effective Modern C ++ (Item 11: "Prefira funções excluídas às indefinidas privadas.").

Em C com extensões GCC

O GNU Compiler Collection 's C compilador vem com 2 extensões que permitem destruidores de execução:

  • O destructor atributo function permite definir funções destruidoras com prioridade global: quando main() retorna, essas funções são chamadas em ordem de prioridade antes que o processo termine. Veja também: Hackeando a arte da exploração .
  • O atributo de variável de limpeza permite anexar uma função destruidora a uma variável: a função é chamada quando a variável sai do escopo.

Xojo

Destruidores em Xojo (REALbasic) podem estar em uma de duas formas. Cada formulário usa uma declaração de método regular com um nome especial (sem parâmetros e sem valor de retorno). A forma mais antiga usa o mesmo nome da Classe com um prefixo ~ (til). O formulário mais recente usa o nome Destructor . A forma mais recente é preferida porque torna a refatoração da classe mais fácil.

Class Foobar
  // Old form
  Sub ~Foobar()
  End Sub

  // New form
  Sub Destructor()
  End Sub
End Class

Veja também

Referências