Q&A

  • Free한 것을 반드시 nil 해줘야 하는지...
(1) TBitmap을 하나 동적으로 생성한 다음에

var
  CurBit: TBitmap;

begin
  CurBit := TBitmap.Create;       // (1)
  ...
  CurBit.Free;      // (2)
end;

(2) Free로 메모리에서 해제 했습니다.

그 다음 nil을 해 줘서 CurBit의 메모리 주소를 해제 해 Free된 것을 참조시 발생할 수 있는 Access Violation을 막는다고 했는데요.

해제된 CurBit를 다시 액세스 하지 않는다면 궂이 nil을 해 줄 필요가 있는가 해서 말입니다.

한 번 생각한건데 만약 Bitmap을 수백, 수천개 Create했다가 Free시키고 nil을 안해줘서 메모리가 부족할 경우는 없는가 해서요. 만약 메모리가 부족하면 nil을 안해준것 위헤 그냥 덮어서 사용하나요?

제가 초보라 질문이 애매모호 한데 음... 예를 들어 우리가 파일 지우면 지워지는것이 아니라 지워진 것처럼 트릭을 쓰는거잖아요. 그러다가 HDD 공간이 부족하면 덮어쓰는것 처럼 메모리도 nil을 안해준 결과로 공간이 부족하면 덮어쓰기 하느냐는 겁니다. ^^;

전 Free는 해줘도 nil은 안해주는 편이거든요. 답변 부탁 드립니다.



그리고 또 하나 제가 테스트 한 것중에

procedure TForm1.Button1Click(Sender: TObject)
var
  TestForm: TForm

begin
   TestForm := TForm(FindComponent(...));

end;

이렇게 선언해서 사용하고 난 후에

TestForm.Free; 를 해 줘도 에러가 안난다는겁니다. (전 Create를 안했음으로 당연히 날줄 알았음 ㅡㅡ;)

왜 에러가 안나는건지요. 그리고 TestForm.Free 안해줘도 되는거죠? (왜 그런 생각을 하냐하면 Create 안했으니까... 그래도 nil은 해야 하나? ㅡㅡ;) 이것도 답변을... 평안하십시오.
3  COMMENTS
  • Profile
    최용일 2003.07.14 23:01
    안녕하세요. 최용일입니다.

    나중에 다시 억세스 하지 않으신다면 굳이 nil을 대입시켜줄 필요는 없습니다...

    Free하면 그 객체가 사용하는 메모리는 이미 반환이 된 상태구요... 단지 객체의 참조만 이미 해제된 메모리 번지를 가리키고 있을뿐입니다... 이 메모리 영역은 이미 자유롭게 풀린 영역이므로 윈도우즈가 언제든지 사용할 수 있습니다.

    FindComponent는 생성되지 않은 컴포넌트는 못찾습니다. 당근 생성되어있으니까 Free 를 해도 에러가 나지 않는겁니다. 대부분 폼위에 컴포넌트를 올려놓으시는데... 이렇게 올려진 것들은 폼이 생성될때 같이 생성됩니다. 물론 나중에 동적으로 생성할수도 있구요... 이렇게 생성된것들만 FindComponent로 찾아집니다...

    이 경우 nil을 대입하시는 것은 상황에 따라서겠죠... Free한 후에 참조를 안한다면 굳이 필요는 없겠네요...

    ^^ 항상 즐코하세요...

  • Profile
    KDDG_RNStone 2003.07.14 23:29
    우선 답변에 무지 감사드립니다. (길드에도 좀 오세요. ^^)

    근데 제가 드린 2번째 질문은 TestForm이라는게 FindComponent로 찾은, 이미 생성된 폼의 주소값만 갖는게 아닌가요?

    위와 같은 근거로 실질적으로 TestForm은 생성이 안되고 주소값만 갖고 있는게 아닌가 하는 생각에서 꼭 Free를 해 주어야 하는지에 대해 질문 드린겁니다.


    procedure TForm1.Button1Click(Sender: TObject)
    var
      TestForm: TForm

    begin
      TestForm := TForm(FindComponent(...));

      If  TestForm <> nil  Then
        TestForm.Close;  // (1)
    end;


    (1)처럼 해 준다면 실제 생성된 폼이 닫히고(OnClose()에 Free 해 줬음) 메모리에서 해제되는거 맞죠?

    그리고 나서 꼭 TestForm.Free를 해 줘야 하냐는 거지요. TestForm이 주소값만 갖는거라면야 해 줄 필요가 없지 않나요?

    제 질문이 이상한가요... ^^; 답변 부탁드립니다.
  • Profile
    최용일 2003.07.15 01:26
    안녕하세요. 최용일입니다.

    FindComponet로 폼을 찾는다라... 그러면 찾을려고 하는 폼이 TForm1에 들어가 있나요? FindComponet는 안에 있는 자식 컴포넌트만 찾아주거든요... 일반적으로 폼에 폼이 들어있지 않는한 폼이 찾아질리는 없습니다... 그리고 찾은 컴포넌트가 폼이 아닌데 형변환해서 Close를 호출하시면 에러가 날수도 있겠네요...

    TForm.Close를 한다고 해서 꼭 메모리에서 제거가 되는것은 아닙니다. CloseAction에 따라서 최소화되기도 하고 숨겨지기도 하고 메모리에서 제가가 되기도 하는거죠...

    1번처럼 OnClose()에서 caFree 해 줬음 메모리에서 제거됩니다. 이경우는 Free가 필요없네요...

    ^^ 항상 즐코하세요..