Q&A

  • 에러 좀 잡아주세요.
안녕하세요.

프로그램 종료(close)하면 아래의 메세지가 나타납니다.

Exception EAccessViolation in module REPORT.EXE at 0008ECC6
....



그럼.
2  COMMENTS
  • Profile
    고지범 2002.09.18 19:36
    소스가 없으니 전체 상황은 모르겠군요...
    걍 추측으로는 해제 코드에서 에러가 있지 않나 합니다.
    가령 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);

    오늘도 즐입다..

  • Profile
    김용산 2006.04.20 20:38
    정말 감사합니다. ㅜ_ㅜ.. 일주일째 이문제 때문에 고생하고 있었어요. 소스 모두 뒤져보니 폼하나를 Free 시키고 있더라구요. ㅜ_ㅜ.. 훌쩍.. 감사의 마음으로 만드신 소스를 코드처리 해드릴께요..

    <!--CodeS-->
    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;
    <!--CodeE-->