Q&A

  • 동적배열로 만든 컨포넌트를 해제시 nil로 해제해도
sLabel.free로 해제 했더니 컨포넌트들이 없어지긴 하는데 자꾸 알수없는 오류가 나네요.

그래서 sLabel:=nil; 이렇게 햇는데 해제가 된건가요? 폼에 컨포넌트 들은 그대로 보이던데?



또 해제할때 따로

for i:=0 to 10 do

begin

sLabel[i].Caption:='';

sLabel[i]:=nil;

end;

이렇게 해야 하나요?

아니면 한번에 sLabel:=nil; 이렇게 하나요?

4  COMMENTS
  • Profile
    이경문 2001.11.25 08:31
    sLabel이라는 컴포넌트 배열이 동적으로 생성한 것인가요? 동적으로 생성했으면 Free를 불러 줘야 합니다. FreeAndNil의 방법을 적용하시기 바랍니다.



    for i := 0 to 10 do

    begin

    if sLabel[i] <> nil then

    begin

    sLabel[i].Free;

    sBaeel[i] := nil;

    end;

    end;



    궁금이 wrote:

    > sLabel.free로 해제 했더니 컨포넌트들이 없어지긴 하는데 자꾸 알수없는 오류가 나네요.

    > 그래서 sLabel:=nil; 이렇게 햇는데 해제가 된건가요? 폼에 컨포넌트 들은 그대로 보이던데?

    >

    > 또 해제할때 따로

    > for i:=0 to 10 do

    > begin

    > sLabel[i].Caption:='';

    > sLabel[i]:=nil;

    > end;

    > 이렇게 해야 하나요?

    > 아니면 한번에 sLabel:=nil; 이렇게 하나요?

  • Profile
    궁금이 2001.11.25 17:06
    free로 해제 하면 프로시저 끝까지 나가긴 하는데요 끝까지 나가고 나서 디버깅 창이 떠버려요 free로 해제 않하고 nil로 하면 메모리에 계속 상주해 있나요?

    하나더 프로그램 종료 하면 free 않해도 다 해제 되나요??





    이경문 wrote:

    > sLabel이라는 컴포넌트 배열이 동적으로 생성한 것인가요? 동적으로 생성했으면 Free를 불러 줘야 합니다. FreeAndNil의 방법을 적용하시기 바랍니다.

    >

    > for i := 0 to 10 do

    > begin

    > if sLabel[i] <> nil then

    > begin

    > sLabel[i].Free;

    > sBaeel[i] := nil;

    > end;

    > end;

    >

    > 궁금이 wrote:

    > > sLabel.free로 해제 했더니 컨포넌트들이 없어지긴 하는데 자꾸 알수없는 오류가 나네요.

    > > 그래서 sLabel:=nil; 이렇게 햇는데 해제가 된건가요? 폼에 컨포넌트 들은 그대로 보이던데?

    > >

    > > 또 해제할때 따로

    > > for i:=0 to 10 do

    > > begin

    > > sLabel[i].Caption:='';

    > > sLabel[i]:=nil;

    > > end;

    > > 이렇게 해야 하나요?

    > > 아니면 한번에 sLabel:=nil; 이렇게 하나요?

  • Profile
    이경문 2001.11.25 17:22
    free하지 않고 nil로만 assign하면 메모리에 계속 상주하게 됩니다(동적 array라고 nil해주면 메모리에서 해제되는 것도 있음).

    그리고 프로그램을 종료할 때 free하지 않은 모든 메모리들은 OS가 알아서 free해 주기는 해 줍니다. 그만큼 OS가 많이 좋아 졌지요.

    그런데, 안정적인 프로그램을 작성하려면 free를 해 주는 것이 좋습니다.

    예를 들어 소켓과 관련된 컴포넌트들은 해제를 시켜 주지 안으면 프로그램 종료시 치명적인 에러들이 날 수 있습니다.



    궁금이 wrote:

    > free로 해제 하면 프로시저 끝까지 나가긴 하는데요 끝까지 나가고 나서 디버깅 창이 떠버려요 free로 해제 않하고 nil로 하면 메모리에 계속 상주해 있나요?

    > 하나더 프로그램 종료 하면 free 않해도 다 해제 되나요??

    >

    >

    > 이경문 wrote:

    > > sLabel이라는 컴포넌트 배열이 동적으로 생성한 것인가요? 동적으로 생성했으면 Free를 불러 줘야 합니다. FreeAndNil의 방법을 적용하시기 바랍니다.

    > >

    > > for i := 0 to 10 do

    > > begin

    > > if sLabel[i] <> nil then

    > > begin

    > > sLabel[i].Free;

    > > sBaeel[i] := nil;

    > > end;

    > > end;

    > >

    > > 궁금이 wrote:

    > > > sLabel.free로 해제 했더니 컨포넌트들이 없어지긴 하는데 자꾸 알수없는 오류가 나네요.

    > > > 그래서 sLabel:=nil; 이렇게 햇는데 해제가 된건가요? 폼에 컨포넌트 들은 그대로 보이던데?

    > > >

    > > > 또 해제할때 따로

    > > > for i:=0 to 10 do

    > > > begin

    > > > sLabel[i].Caption:='';

    > > > sLabel[i]:=nil;

    > > > end;

    > > > 이렇게 해야 하나요?

    > > > 아니면 한번에 sLabel:=nil; 이렇게 하나요?

  • Profile
    궁금이 2001.11.25 18:59
    이경문 wrote:

    > free하지 않고 nil로만 assign하면 메모리에 계속 상주하게 됩니다(동적 array라고 nil해주면 메모리에서 해제되는 것도 있음).

    > 그리고 프로그램을 종료할 때 free하지 않은 모든 메모리들은 OS가 알아서 free해 주기는 해 줍니다. 그만큼 OS가 많이 좋아 졌지요.

    > 그런데, 안정적인 프로그램을 작성하려면 free를 해 주는 것이 좋습니다.

    > 예를 들어 소켓과 관련된 컴포넌트들은 해제를 시켜 주지 안으면 프로그램 종료시 치명적인 에러들이 날 수 있습니다.

    >

    > 궁금이 wrote:

    > > free로 해제 하면 프로시저 끝까지 나가긴 하는데요 끝까지 나가고 나서 디버깅 창이 떠버려요 free로 해제 않하고 nil로 하면 메모리에 계속 상주해 있나요?

    > > 하나더 프로그램 종료 하면 free 않해도 다 해제 되나요??

    > >

    > >

    > > 이경문 wrote:

    > > > sLabel이라는 컴포넌트 배열이 동적으로 생성한 것인가요? 동적으로 생성했으면 Free를 불러 줘야 합니다. FreeAndNil의 방법을 적용하시기 바랍니다.

    > > >

    > > > for i := 0 to 10 do

    > > > begin

    > > > if sLabel[i] <> nil then

    > > > begin

    > > > sLabel[i].Free;

    > > > sBaeel[i] := nil;

    > > > end;

    > > > end;

    > > >

    > > > 궁금이 wrote:

    > > > > sLabel.free로 해제 했더니 컨포넌트들이 없어지긴 하는데 자꾸 알수없는 오류가 나네요.

    > > > > 그래서 sLabel:=nil; 이렇게 햇는데 해제가 된건가요? 폼에 컨포넌트 들은 그대로 보이던데?

    > > > >

    > > > > 또 해제할때 따로

    > > > > for i:=0 to 10 do

    > > > > begin

    > > > > sLabel[i].Caption:='';

    > > > > sLabel[i]:=nil;

    > > > > end;

    > > > > 이렇게 해야 하나요?

    > > > > 아니면 한번에 sLabel:=nil; 이렇게 하나요?