2011-11-18 4 views
-1

나는 다음과 같은 클래스를 사용하고내 앱의 메모리 누수 위치를 어떻게 알 수 있습니까?

mycalss = class 

    public 

     Self.timer1: TTimer; 
     Self.abitmap: tbitmap; 
     Self.animage: TImage; 
     Self.formxyz:form; 
    //some other declaration 
    //also having my own constructor and destructor overridden 

    end; 

버튼이 myclass1가 생성됩니다 클릭하고 난 창문 작업 만들기 버튼을 클릭 어느 때 다른 버튼을 클릭 myclass1는

begin 

    FreeAndNil(Self.timer1) ; 
    FreeAndNil(Self.abitmap) ; 
    FreeAndNil(Self.animage); 
     //others 
    Self.formxyz.Close ; 
    FreeAndNil(Self.formxyz); 
    FreeAndNil(Self) ; 

    inherited Destroy; 
end; 

파괴 될 때 관리자가 800 KB의 메모리 소비 증가를 보여 주며 내가 클릭 할 때마다 500kb의 용량이 감소합니다.

크기 증가가 생성 될 때 (o ther 부작용) 내 애플 리케이션은 간단한 하나입니다.

질문 : 나는 델파이 응용 프로그램 (나는이 제대로 확보 할 경우) 작업을 파괴에 제거하기 위해 만든 모든 객체 (~ 800킬로바이트)를 제거 것으로 예상 할 수있다? 당신이 클래스에 할당

+0

사실 개체를 파괴하면 파괴 절차에서 Free() 만 호출 할 수 있습니다. 변수를 다시 할당해야하는 경우에만 FreeAndNil()을 사용할 수 있습니다. – evilone

+6

'FreeAndNil (Self)'부분이 틀렸어. – CodesInChaos

+1

또한 생성자가 끝날 때'상속 된 파괴 '를 호출하는 것이 더 좋습니다. – CodesInChaos

답변

1

최초의 유일한 자유의 목적은 - 상속 및 그 상속 클래스는 물건을 확보하고 싶어 호출 할 때 멋진 부작용이있을 것이다 self 변수 이 파괴되지 않습니다.

메모리 누수 여부를 확인하는 유일한 방법은 ReportMemoryLeaksOnShutdown 또는 을 사용하는 것입니다. - sourceforge에서 FastMM 소스를 다운로드하십시오.

두 번째로 내부 메모리 관리자의 특수한 문제가 발생했다고 생각합니다. 내부 메모리 관리자는 매우 큰 할당 블록의 메모리 만 해제합니다. 내부를 살펴보면 메모리 관리자는 기본적으로 3 개의 블록 관리자, 작은 크기의 매체 및 큰 블록의 관리자 인 으로 구성된다는 것을 알 수 있습니다. 중소 규모 블록의 관리자는 메모리를 유지하고 창에 할당을 해제하지 않습니다. 가까운 장래에 재사용 될 가능성이 상당히 높습니다. 그것은 단지 큰 블록을위한 메모리를 즉시 할당 해제합니다.

+0

+1 '소스 포지에서 FastMM 소스를 다운로드하십시오.' – Johan

1

귀하의 생성자와 소멸자는 다음과 같이한다 :

constructor TMyClass.Create(AOwner: TComponent); 
begin 
    inherited; 
    timer1:= TTimer.Create; 
    Bitmap1:= TBitmap.Create; 
    AnImage:= TImage.Create(AOwner); 
    ... 
end; 

destructor TMyClass.Destroy; 
begin 
    timer1.Free; 
    abitmap.Free; 
    animage.Free; 
    inherited Destroy; 
end; 

당신이 FreeAndNil를 호출 할 의미가없는 모든 멤버를 재사용되지 않기 때문에.

관련 문제