(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은 해야 하나? ㅡㅡ;) 이것도 답변을... 평안하십시오.
나중에 다시 억세스 하지 않으신다면 굳이 nil을 대입시켜줄 필요는 없습니다...
Free하면 그 객체가 사용하는 메모리는 이미 반환이 된 상태구요... 단지 객체의 참조만 이미 해제된 메모리 번지를 가리키고 있을뿐입니다... 이 메모리 영역은 이미 자유롭게 풀린 영역이므로 윈도우즈가 언제든지 사용할 수 있습니다.
FindComponent는 생성되지 않은 컴포넌트는 못찾습니다. 당근 생성되어있으니까 Free 를 해도 에러가 나지 않는겁니다. 대부분 폼위에 컴포넌트를 올려놓으시는데... 이렇게 올려진 것들은 폼이 생성될때 같이 생성됩니다. 물론 나중에 동적으로 생성할수도 있구요... 이렇게 생성된것들만 FindComponent로 찾아집니다...
이 경우 nil을 대입하시는 것은 상황에 따라서겠죠... Free한 후에 참조를 안한다면 굳이 필요는 없겠네요...
^^ 항상 즐코하세요...