Font를 생성하여 곧바로 OleFont로 사용하려고
다음과 같은 코드를 짰습니다.
procedure TForm1.Button1Click(Sender: TObject);
var
I: Integer;
OleFont: IFontDisp;
begin
for I := 0 to 50 do begin
GetOleFont(TFont.Create, OleFont);
...
end;
end;
그런데 나중에 Garbage가 과연 생기지 않을 수 있는가 알아보기 위해서
다음과 같은 테스트를 했습니다.
procedure TForm1.Button1Click(Sender: TObject);
var
I: Integer;
OleFont: IFontDisp;
Mem: TMemoryStatus;
begin
Mem.dwLength := sizeof(Mem);
for I := 0 to 50 do begin
GetOleFont(TFont.Create, OleFont);
OleFont._Release;
OleFont := nil;
end;
GlobalMemoryStatus(Mem);
Label1.Caption := IntToStr(Mem.dwAvailPhys);
end;
그런데 이걸 테스트해보니 꾸준히 사용가능한 물리적 메모리의 양이
감소합니다.
그렇지만, for문 안에서 아무것도 하지 않아도
일시적으로는 감소하는 것도 볼 수 있었습니다.
그래서 Mem.dwAVailPhys가 과연 테스트에 적합한 것이었는지,
정말 Garbage가 발생하는 것인지, 발생한다면 무엇을 잘못한 것인지,
발생한다면 Garbage가 생기지 않게 하려면 도대체 어떻게 해야 하는지
등을 알고 싶습니다. (제 생각엔 저렇게 코딩했을때 Garbage가 생기지
않을 줄 알았습니다.)
위와 같이 하지 않고 다음과 같이 하면
Fnt := TFont.Create;
GetOleFont(Fnt, OleFont);
....
Fnt.Free;
이때는 메모리가 새는 것 같진 않더군요...
하지만 올바른 사용법인지 궁금합니다.
고견을 부탁드리겠습니다.
GetOleFont(TFont.Create, OleFont); <-----
위 부분에서 TFont를 생성해서 인터페이스를 얻었는데 인터페이스를 Release한다고 해도
TFont.Create로 생성된 TFont객체는 Free가 안되어있어서 Garbage가 생기는것 같습니다.
^^ 항상 즐코하세요.
김일영 wrote:
> Font를 생성하여 곧바로 OleFont로 사용하려고
> 다음과 같은 코드를 짰습니다.
>
> procedure TForm1.Button1Click(Sender: TObject);
> var
> I: Integer;
> OleFont: IFontDisp;
> begin
> for I := 0 to 50 do begin
> GetOleFont(TFont.Create, OleFont);
> ...
> end;
> end;
>
> 그런데 나중에 Garbage가 과연 생기지 않을 수 있는가 알아보기 위해서
> 다음과 같은 테스트를 했습니다.
>
> procedure TForm1.Button1Click(Sender: TObject);
> var
> I: Integer;
> OleFont: IFontDisp;
> Mem: TMemoryStatus;
> begin
> Mem.dwLength := sizeof(Mem);
> for I := 0 to 50 do begin
> GetOleFont(TFont.Create, OleFont);
> OleFont._Release;
> OleFont := nil;
> end;
> GlobalMemoryStatus(Mem);
> Label1.Caption := IntToStr(Mem.dwAvailPhys);
> end;
>
> 그런데 이걸 테스트해보니 꾸준히 사용가능한 물리적 메모리의 양이
> 감소합니다.
> 그렇지만, for문 안에서 아무것도 하지 않아도
> 일시적으로는 감소하는 것도 볼 수 있었습니다.
>
> 그래서 Mem.dwAVailPhys가 과연 테스트에 적합한 것이었는지,
> 정말 Garbage가 발생하는 것인지, 발생한다면 무엇을 잘못한 것인지,
> 발생한다면 Garbage가 생기지 않게 하려면 도대체 어떻게 해야 하는지
> 등을 알고 싶습니다. (제 생각엔 저렇게 코딩했을때 Garbage가 생기지
> 않을 줄 알았습니다.)
>
> 위와 같이 하지 않고 다음과 같이 하면
>
> Fnt := TFont.Create;
> GetOleFont(Fnt, OleFont);
> ....
> Fnt.Free;
>
> 이때는 메모리가 새는 것 같진 않더군요...
> 하지만 올바른 사용법인지 궁금합니다.
>
> 고견을 부탁드리겠습니다.
>