0Pricing
Lua Academy · Aula

Finalizadores com __gc

Registre metamétodos __gc para limpeza quando os objetos forem coletados.

Finalizadores com __gc é uma aula grátis de Lua Academy no CoddyKit. Esta é a aula 3 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Lua Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Lua Academy inclui 4 aulas no total.

O que é um finalizador?

Um finalizador é uma função chamada pelo coletor de lixo imediatamente antes de um objeto ser liberado. Em Lua, ele é implementado por meio do metamétodo __gc na metatabela de uma tabela.

Definindo um finalizador

Anexe uma função __gc a uma metatabela antes ou no momento em que o objeto for criado.

local mt = {
  __gc = function(self)
    print("Finalizing:", self.name)
  end
}
do
  local obj = setmetatable({name = "resource"}, mt)
end
collectgarbage()  -- prints: Finalizing: resource

Padrão de limpeza de recursos

Finalizadores são ideais para liberar recursos externos: identificadores de arquivos, conexões de banco de dados ou memória C.

local function openResource(path)
  local f = io.open(path, "r")
  return setmetatable({handle = f, path = path}, {
    __gc = function(self)
      if self.handle then
        self.handle:close()
        print("Closed:", self.path)
      end
    end
  })
end

Ordem dos finalizadores

Objetos com finalizadores são coletados na ordem inversa à de sua criação. Por padrão, os finalizadores são executados um por ciclo de coleta de lixo.

Ressurreição

Se um finalizador armazenar uma referência ao objeto (em um global ou valor superior), o objeto será ressuscitado. Ele receberá apenas mais uma chamada de finalizador quando for finalmente coletado.

Userdata e __gc

Em extensões C, __gc em userdata é a principal forma de liberar memória C. No código Lua puro, as tabelas usam o mesmo mecanismo por meio de metatabelas.

Objetos proxy para RAII

Crie uma tabela proxy cujo __gc feche o recurso real. Isso imita RAII de C++.

local function scoped(resource, cleanup)
  return setmetatable({resource}, {
    __gc = function(self) cleanup(self[1]) end
  })
end

Limitações dos finalizadores

Os finalizadores não devem: chamar operações de corrotinas, ceder a execução nem presumir qualquer ordem na permanência de outros objetos. Mantenha-os simples e curtos.

Tabelas fracas e finalizadores

Os objetos em tabelas fracas ainda podem ser finalizados. Após a finalização (e uma possível ressurreição), eles são coletados completamente no ciclo seguinte.

Proteção de finalizador do toLua

Use um sinalizador booleano dentro do finalizador para impedir uma limpeza duplicada em caso de ressurreição.

local mt = {}
mt.__gc = function(self)
  if not self._closed then
    self._closed = true
    -- cleanup...
  end
end

Orientação prática

Prefira métodos :close() ou :destroy() explícitos para uma limpeza determinística. Use __gc como uma rede de segurança para omissões acidentais, não como o gerenciamento principal de recursos.

Pergunta sobre finalizadores

Quando o metamétodo __gc é chamado?

Recapitulação: finalizadores com __gc

O metamétodo __gc é executado imediatamente antes de um objeto ser coletado, permitindo uma limpeza de recursos no estilo RAII. Use-o como uma rede de segurança; prefira métodos explícitos de fechamento ou destruição para o gerenciamento determinístico de recursos.

Perguntas Frequentes

A aula “Finalizadores com __gc” é grátis?

Sim — o texto completo de “Finalizadores com __gc” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Lua Academy, atualize para CoddyKit PRO. O curso de Lua Academy inclui 4 aulas no total.

O que vou aprender em “Finalizadores com __gc”?

Registre metamétodos __gc para limpeza quando os objetos forem coletados. Você pratica Lua Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar Lua Academy?

Nenhuma experiência prévia é necessária. Lua Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 3 de 4.

Quanto tempo leva a aula “Finalizadores com __gc”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de Lua Academy?

Sim. Cada aula de Lua Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. Noções básicas do coletor de lixo do Lua
  2. Chaves e valores fracos
  3. Finalizadores com __gc
  4. Evitando vazamentos de memória
← Voltar para Lua Academy