2011-03-18 4 views
2

안녕하세요, 다음 예제의 소멸자 구현이 맞고 동일하다고 말할 수 있습니까?델파이의 TCollectionItem 및 소멸자 메서드

TTaskItem = class (TCollectionItem) 
    private 
    FTask: TTask; 

    public 
    constructor Create(Collection: TCollection);override; 
    destructor Destroy;override; 

    property Task: TTask read FTask write FTask; 
    end; 

// //이 두 같은 있습니까?

destructor TTaskItem.Destroy; 
begin 
    inherited Destroy; 
end; 

destructor TTaskItem.Destroy; 
begin 
    inherited; 
end; 

답변

1

예 모두 정확하고 동일합니다.

일반적으로 당신은 생성자에서 FTask을 만든 것입니다 및 소멸자는 읽을 것입니다 :

destructor TTaskItem.Destroy; 
begin 
    FTask.Free; 
    inherited; 
end; 

항상 당신이했던 것처럼 당신이 당신의 소멸자를 선언 할 때 override을 포함해야합니다. 이것을 잊으면 실행되지 않습니다. 이것은 메모리/리소스 누출의 고전적인 소스입니다.

생성자에서 첫 번째 작업으로 그리고 소멸자의 마지막 작업으로 inherited을 호출해야합니다. 이것은 창조와 전복이 언제나 필요한 것과 반대 순서로 이루어 지도록 조정합니다.

첫 번째를 만들 분명 당신이 한 예를 들어, 당신은 두 물체 A와 B를 만들 수 있습니다, 그리고 B는 B의 생성자에 전달되는 A를 참조가 : 파괴하면

A := TClassA.Create; 
B := TClassB.Create(A); 

B가 먼저 A를 가리키는 것과 관련이있는 경우를 대비하여 B를 먼저 파괴하려고합니다. 만약 당신이 그것을 잘못된 길로 돌린다면, B는 이미 파괴 된 A에 대한 방법을 호출 할 것입니다. 그래서 당신의 소멸자가 읽습니다 :

B.Free; 
A.Free; 
+0

좋습니다. 감사! – Paul