※ 이 글은 Delphi6을 예로 하였으며, Delphi7에서는 정상적으로 동작한다는 의견도 있었으나,
실제로 확인은 해보지 않았음.
일반적으로 코딩시 Class를 생성하면 Try~Finally 구문을 이용하여 Class를 Free시켜주는
방식을 취하게 된다.
Bitmap := TBitmap.Create;
Try
Finally
Bitmap.Free;
End;
물론 정상적인 방법대로라면야, 저렇게 하면 되겠지만..........
그 길이가 길어지는 경우 어떠한 사정에 의해서 TBitmap이 Create되지 않은채
Free가 호출되어지는 상황이 있을수도 있게 된다.
어떤 경우인지는 따지지 마라... 따지고 들어가면 골아프다. -_-;;;;
아무튼 TPrinter를 이용하여 이미지를 출력하는 프로그램을 작성중에, 가끔씩 이미지가
출력이 되지 않는다는 버그가 있다고 하여, 소스를 보던중...
Create되지 않은 Bitmap을 Free할수도 있는 경우를 발견했는데.............
샘플 프로그램을 만들어서 Test를 해보니 Access Violation 오류가 발생하였다.
Bitmap.Handle / Bitmap.HandleAllocation으로는 체크가 되지 않았고...
Assigned() 함수로도 Bitmap이 생성되어 있는것으로 나오니.. 환장할 노릇....
[샘플코드]
procedure TForm1.Button1Click(Sender: TObject);
Var
Bitmap : TBitmap;
begin
{ 다른 코딩 }
{ 어쩌꾸쩌쩌꾸 }
Try
Finally
If Assigned( Bitmap ) Then
FreeAndNil( Bitmap );
End;
end;
위의 코드는 에러가 나는가? 나지 않는가?
Access Violation 에러가 발생한다.................
죠낸 저거 어떻게 확인해야 하는거야..... 쒸.. -_-;;;;
아무튼 죠낸 쪽팔리기도 하고......... 개발로 몇년동안 밥먹고 산다는 놈이.... 에혀.....
결론은 "Garbage Value"
쓰레기값이 들어갈수 있는 Bitmap 변수를 초기에 Nil로 초기화시킨후에 수행하면,
Assigned(Bitmap)에서 Bitmap이 Nil값이므로, Free를 수행하지 않게 하면 되는것이다.
죠낸 알고나니 간단한데... 이것때문에.. 한참 고민했다. 젝일헐.....
공부해야대. 공부 ㅠㅠ
Bitmap := Nil;