0Pricing
Lua Academy · レッスン

__gcによるファイナライザー

オブジェクト回収時のクリーンアップ用に__gcメタメソッドを登録します。

「__gcによるファイナライザー」はCoddyKit上の無料Lua Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはLua Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Lua Academyコースには全4レッスンが含まれています。

ファイナライザーとは

ファイナライザーは、オブジェクトが解放される直前にGCによって呼び出される関数です。Luaでは、テーブルのメタテーブルに設定した __gc メタメソッドによって実装します。

ファイナライザーの設定

オブジェクトの作成前または作成時に、メタテーブルへ __gc 関数を設定します。

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

リソースのクリーンアップパターン

ファイナライザーは、ファイルハンドル、データベース接続、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

ファイナライザーの順序

ファイナライザーを持つオブジェクトは、作成順とは逆の順序で回収されます。デフォルトでは、1回のGCサイクルにつき1つのファイナライザーが実行されます。

復活

ファイナライザーがオブジェクトへの参照を(グローバル変数やupvalueに)保存すると、そのオブジェクトは復活します。最終的に回収される際、ファイナライザーが呼び出されるのはもう一度だけです。

Userdataと__gc

C拡張では、userdataの __gc がCメモリを解放する主な方法です。純粋なLuaコードでは、テーブルがメタテーブルを介して同じ仕組みを使用します。

RAII用のプロキシオブジェクト

__gc で実際のリソースを閉じるプロキシテーブルを作成します。これはC++のRAIIを模倣するものです。

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

ファイナライザの制限事項

ファイナライザでは、コルーチン操作の呼び出し、yield、または他のオブジェクトの存続順序を前提とする処理を行わないでください。処理は単純かつ短く保ってください。

弱テーブルとファイナライザ

弱テーブル内のオブジェクトもファイナライズされることがあります。ファイナライズ後(復活する可能性もあります)、次のサイクルで完全に回収されます。

toLua ファイナライザガード

復活が発生した場合に二重クリーンアップを防ぐため、ファイナライザ内でbooleanフラグを使用してください。

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

実践的なアドバイス

確定的なクリーンアップには、明示的な:close()または:destroy()メソッドを優先してください。__gcは、主たるリソース管理手段ではなく、呼び出し忘れに備えた安全策として使用してください。

ファイナライザに関する質問

__gcメタメソッドはいつ呼び出されますか?

復習:__gcによるファイナライザ

__gcメタメソッドは、オブジェクトが回収される直前に実行され、RAIIスタイルのリソースクリーンアップを可能にします。安全策として使用し、確定的なリソース管理には明示的なclose/destroyメソッドを優先してください。

よくある質問

「__gcによるファイナライザー」レッスンは無料ですか?

はい。「__gcによるファイナライザー」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Lua Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Lua Academyコースには全4レッスンが含まれています。

「__gcによるファイナライザー」で何を学びますか?

オブジェクト回収時のクリーンアップ用に__gcメタメソッドを登録します。 ブラウザで直接実行するハンズオンコードでLua Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Lua Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのLua Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「__gcによるファイナライザー」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このLua Academyレッスンでコードを書いて実行できますか?

はい。すべてのLua Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. Luaガベージコレクターの基礎
  2. 弱いキーと弱い値
  3. __gcによるファイナライザー
  4. メモリリークの回避
← Lua Academyに戻る