finalize

finalize

클래스가 finalize 메서드를 정의하면, 해당 클래스의 인스턴스가 가비지 컬렉션될 때 그 메서드가 호출돼요.

class Foo
  def finalize
    # Invoked when Foo is garbage-collected
    # Use to release non-managed resources (ie. C libraries, structs)
  end
end

이 메서드는 Crystal 가비지 컬렉터가 직접 관리하지 않는, 외부 라이브러리가 할당한 리소스를 해제할 때 사용해요.

예를 들면 IO::FileDescriptor#finalizeOpenSSL::Digest#finalize에서 이런 사례를 찾아볼 수 있어요.

출처: Crystal 공식 문서

본문

참고 사항:

  • finalize 메서드는 객체가 initialize 메서드를 통해 완전히 초기화된 뒤에만 한 번 호출돼요. initialize 메서드 안에서 예외가 발생하면 finalize는 호출되지 않아요. 클래스가 finalize 메서드를 정의했다면, initialize 메서드에서 발생할 수 있는 예외를 꼭 잡아서 리소스를 해제해야 해요.

  • 가비지 컬렉션 도중에 새로운 객체 인스턴스를 할당하면 정의되지 않은 동작(undefined behavior)이 발생해 프로그램이 크래시될 가능성이 커요.

더 알아보기

  • IO::FileDescriptor#finalize: 실제 리소스 해제 사례
  • OpenSSL::Digest#finalize: 실제 리소스 해제 사례