클래스 소멸

클래스 소멸 (Class Destruction)

클래스 인스턴스는 반드시 소멸자로 파괴해야 해요. 생성자와 달리 소멸자에는 선택의 여지가 없습니다. 소멸자 이름은 반드시 Destroy여야 하고, TObject에 선언된 Destroy 소멸자를 override해야 하며, 인자를 가질 수 없고, 항상 상속된 소멸자를 호출해야 해요.

출처: Class destruction

본문

DestroyFreeInstance를 호출하는데, 기본 구현에서는 FreeMem을 호출해 인스턴스가 차지하던 메모리를 해제합니다.

Nil 인스턴스에 소멸자를 호출하는 실수를 피하려면 TObject.Free 메서드를 쓰는 게 좋아요. 이 메서드는 SelfNil이 아닌지 확인해서, Nil이 아니면 Destroy를 호출하고 Nil이면 그냥 종료합니다.

인스턴스를 파괴한다고 해서 그 인스턴스에 대한 참조가 제거되거나 Nil이 되는 건 아니에요.

Var
  A : TComponent;

begin
  A:=TComponent.Create;
  A.Name:='MyComponent';
  A.Free;
  Writeln('A is still assigned: ',Assigned(A));
end.

Free 호출 후에도 변수 ANil이 아니에요. 이 프로그램의 출력은 다음과 같습니다.

A is still assigned: TRUE

소멸자가 호출된 뒤 변수 A가 확실히 비워지게 하려면 SysUtils 유닛의 FreeAndNil 함수를 사용하면 돼요. 이 함수는 Free를 호출한 뒤 객체 포인터(위 예시의 A)에 Nil을 써넣습니다.

Var
  A : TComponent;

begin
  A:=TComponent.Create;
  A.Name:='MyComponent';
  FreeAndNil(A);
  Writeln('A is still assigned: ',Assigned(A));
end.

FreeAndNil 호출 후에는 변수 ANil이 들어 있으며, 이 프로그램의 출력은 다음과 같아요.

A is still assigned: FALSE

Remark 생성자 실행 중 예외가 발생하면 소멸자가 자동으로 호출됩니다.

더 알아보기