Q&A

  • [기초] Function에서 언제 객체를 프리해야 하는지...
안녕하세요..어린왕자입니다..

질문은요,..

Function CreateSaveList:TStringList;

var TmpStringList:TStringList;

begin

TmpStringList:=TStringList.Create;



// TmpStringList 작업들..





result:=TmpStringList;



end;



이라고 짰을때..

TmpStringList는 언제 Free를 시켜줘야 하는 가요?

참..궁금합니다..

아니 어떻게 Free를 시켜줘야 하는지..



자세한 설명 바랍니다..특히 용일님^^;

용일님..안녕하셨어염??

5  COMMENTS
  • Profile
    Black}{ole 2000.07.25 02:03
    어린왕자 wrote:

    > 안녕하세요..어린왕자입니다..

    > 질문은요,..

    > Function CreateSaveList:TStringList;

    > var TmpStringList:TStringList;

    > begin

    > TmpStringList:=TStringList.Create;

    >

    > // TmpStringList 작업들..

    >

    >

    > result:=TmpStringList;

    >

    > end;

    >

    > 이라고 짰을때..

    > TmpStringList는 언제 Free를 시켜줘야 하는 가요?

    > 참..궁금합니다..

    > 아니 어떻게 Free를 시켜줘야 하는지..

    >

    > 자세한 설명 바랍니다..특히 용일님^^;

    > 용일님..안녕하셨어염??





    안녕하세요. ^^

    Result에 값을 넘겼음.. 그담에 바로 해제하면 될것 같네요.

    Result := TmpStringList;

    TmpStringList.Free;



    그럼..20000.

  • Profile
    최용일 2000.07.25 02:32
    안녕하세요. 최용일입니다.



    함수의 결과값인 Result는 포인터입니다. 그러므로 강민주님의 말씀처럼 함수내부에세



    Free해주면 Result는 nil값을 가집니다. access어쩌구하는 에러가 발생하겠죠...



    함수내부에서 객체를 생성해서 반환해준다면 그 객체를 Free해줄 시점은 함수외부에서



    그 객체의 사용을 마친 시점입니다. 그러니까 다 쓴뒤에 Free해주세요.



    ^^ 항상 즐코하세요



    Black}{ole wrote:

    > 어린왕자 wrote:

    > > 안녕하세요..어린왕자입니다..

    > > 질문은요,..

    > > Function CreateSaveList:TStringList;

    > > var TmpStringList:TStringList;

    > > begin

    > > TmpStringList:=TStringList.Create;

    > >

    > > // TmpStringList 작업들..

    > >

    > >

    > > result:=TmpStringList;

    > >

    > > end;

    > >

    > > 이라고 짰을때..

    > > TmpStringList는 언제 Free를 시켜줘야 하는 가요?

    > > 참..궁금합니다..

    > > 아니 어떻게 Free를 시켜줘야 하는지..

    > >

    > > 자세한 설명 바랍니다..특히 용일님^^;

    > > 용일님..안녕하셨어염??

    >

    >

    > 안녕하세요. ^^

    > Result에 값을 넘겼음.. 그담에 바로 해제하면 될것 같네요.

    > Result := TmpStringList;

    > TmpStringList.Free;

    >

    > 그럼..20000.

  • Profile
    어린왕자 2000.07.25 02:43
    var

    SaveStringList:TStringList;

    begin

    SaveStringList:=TStringList.create; //혹시 여기서 Create해줄필요가 없나요??

    SaveStringList:=CreateSaveList; //펑션을 쓰구..



    // 작업하구..



    SaveStringList.free; // 프리시켜주구..

    // 펑션내 객체는 언제 프리시켜주죠? 어떻게 해야되졍??

    end;







    최용일 wrote:

    > 안녕하세요. 최용일입니다.

    >

    > 함수의 결과값인 Result는 포인터입니다. 그러므로 강민주님의 말씀처럼 함수내부에세

    >

    > Free해주면 Result는 nil값을 가집니다. access어쩌구하는 에러가 발생하겠죠...

    >

    > 함수내부에서 객체를 생성해서 반환해준다면 그 객체를 Free해줄 시점은 함수외부에서

    >

    > 그 객체의 사용을 마친 시점입니다. 그러니까 다 쓴뒤에 Free해주세요.

    >

    > ^^ 항상 즐코하세요

    >

    > Black}{ole wrote:

    > > 어린왕자 wrote:

    > > > 안녕하세요..어린왕자입니다..

    > > > 질문은요,..

    > > > Function CreateSaveList:TStringList;

    > > > var TmpStringList:TStringList;

    > > > begin

    > > > TmpStringList:=TStringList.Create;

    > > >

    > > > // TmpStringList 작업들..

    > > >

    > > >

    > > > result:=TmpStringList;

    > > >

    > > > end;

    > > >

    > > > 이라고 짰을때..

    > > > TmpStringList는 언제 Free를 시켜줘야 하는 가요?

    > > > 참..궁금합니다..

    > > > 아니 어떻게 Free를 시켜줘야 하는지..

    > > >

    > > > 자세한 설명 바랍니다..특히 용일님^^;

    > > > 용일님..안녕하셨어염??

    > >

    > >

    > > 안녕하세요. ^^

    > > Result에 값을 넘겼음.. 그담에 바로 해제하면 될것 같네요.

    > > Result := TmpStringList;

    > > TmpStringList.Free;

    > >

    > > 그럼..20000.

  • Profile
    Black}{ole 2000.07.25 02:55
    최용님 말씀이 옳쿤요.. 전 해보지도 않고 그럴것 같아 올렸는뎅

    참고하세요.



    type

    TForm1 = class(TForm)

    Button1: TButton;

    procedure Button1Click(Sender: TObject);

    procedure FormCreate(Sender: TObject);

    procedure FormDestroy(Sender: TObject);

    private

    SaveStr: TStrings;

    public

    function TestFunc: TStrings;

    end;



    var

    Form1: TForm1;



    implementation



    {$R *.DFM}



    function TForm1.TestFunc: TStrings;

    begin

    SaveStr.Add('Black}{ole');

    Result := SaveStr;

    end;



    procedure TForm1.Button1Click(Sender: TObject);

    var

    TempStr: TStrings;

    begin

    TempStr := TestFunc;

    Form1.Caption := TempStr.Text;

    end;



    procedure TForm1.FormCreate(Sender: TObject);

    begin

    SaveStr := TStringList.Create;

    end;



    procedure TForm1.FormDestroy(Sender: TObject);

    begin

    SaveStr.Free;

    end;

  • Profile
    최용일 2000.07.25 02:47
    안녕하세요. 최용일입니다.



    Create는 함수내부에서 하니까 해줄필요가 없습니다. 해주어도 에러는 안나지만 메모리



    누수가....



    var

    SaveStringList:TStringList;

    begin

    SaveStringList:=CreateSaveList; //펑션을 쓰구..



    // 작업하구..



    SaveStringList.free; // 프리시켜주구..

    end;

    ^^ 항상 즐코하세요.



    어린왕자 wrote:

    > var

    > SaveStringList:TStringList;

    > begin

    > SaveStringList:=TStringList.create; //혹시 여기서 Create해줄필요가 없나요??

    > SaveStringList:=CreateSaveList; //펑션을 쓰구..

    >

    > // 작업하구..

    >

    > SaveStringList.free; // 프리시켜주구..

    > // 펑션내 객체는 언제 프리시켜주죠? 어떻게 해야되졍??

    > end;