procedure TForm1.Button1Click(Sender: TObject);
begin
FTest := TQuery.Create(nil);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
FTest.Free;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
if Assigned(FTest) then FTest.Free;
end;
만일 Button1이 눌리고 난 다음 , Button2가 눌렸고... 그리고 프로그램이 종료한다면... Access violation이 일어나죠...
위와 같은 경우는 if Assigned() then.... 이 것이 소용없다는 거 아시죠?
왜냐면, FTest 라는 놈이 잘 보면 포인터고, 포인터의 값은 있는 데, 해당 메모리가 없는 경우기 때문에 Access Violation이 일어나는 겁니다..
질문하신 경우도 이런 경우라고 생각되는 데요...
객체 해제 코드를 아래와 같이 사용해 보세요...
someThing.Free;
-->
if Assigned(someThing) then FreeAndNil(someThing);
걍 추측으로는 해제 코드에서 에러가 있지 않나 합니다.
가령 TQuery를 동적으로 만들어서 사용한다고 하면...
TForm1 = class(TForm)
...
private
FTest :TQuery;
...
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
FTest := TQuery.Create(nil);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
FTest.Free;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
if Assigned(FTest) then FTest.Free;
end;
만일 Button1이 눌리고 난 다음 , Button2가 눌렸고... 그리고 프로그램이 종료한다면... Access violation이 일어나죠...
위와 같은 경우는 if Assigned() then.... 이 것이 소용없다는 거 아시죠?
왜냐면, FTest 라는 놈이 잘 보면 포인터고, 포인터의 값은 있는 데, 해당 메모리가 없는 경우기 때문에 Access Violation이 일어나는 겁니다..
질문하신 경우도 이런 경우라고 생각되는 데요...
객체 해제 코드를 아래와 같이 사용해 보세요...
someThing.Free;
-->
if Assigned(someThing) then FreeAndNil(someThing);
오늘도 즐입다..