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#finalize나 OpenSSL::Digest#finalize에서 이런 사례를 찾아볼 수 있어요.
출처: Crystal 공식 문서
본문
참고 사항:
-
finalize메서드는 객체가initialize메서드를 통해 완전히 초기화된 뒤에만 한 번 호출돼요.initialize메서드 안에서 예외가 발생하면finalize는 호출되지 않아요. 클래스가finalize메서드를 정의했다면,initialize메서드에서 발생할 수 있는 예외를 꼭 잡아서 리소스를 해제해야 해요. -
가비지 컬렉션 도중에 새로운 객체 인스턴스를 할당하면 정의되지 않은 동작(undefined behavior)이 발생해 프로그램이 크래시될 가능성이 커요.
더 알아보기
- IO::FileDescriptor#finalize: 실제 리소스 해제 사례
- OpenSSL::Digest#finalize: 실제 리소스 해제 사례