Q&A

  • FreeMem과 NIL
build_command 라는 함수는 Pointer 를 리턴합니다. 이함수로부터 pointer를 전달받은 변수의 내용을 확인해보면 엉뚱한 것이 나오네요. 그이유가build_command의 마지막부분에 return 해준 Pointer에 할당된 메모리를 FreeMem으로 해지해주었기 때문인데요, 그래서 build_command 에서 return 하는 Pointer를 그냥 NIL 로 해주기만 하니까 build_command로부터 return 받은 변수값이 온전히 나오네요.



function build_command(parameters..) : Pointer

var

dest : Pointer;

begin

dest := AllocMem(적당한 크기);

dest에 값을 채움



return := dest;

FreeMem(dest);

//dest := NIL;

end;



procedure test;

var

command : Pointer;

begin

command := build_command(parameters..);

command 의 값을 확인할 수 있는 code..

end;



이와같이 했을 때 test procedure가 return 값을 받았을 때는 이미 dest의 내용이 Free된 상태어서 쓰레기값이 나옵니다. 그래서 위에 주석부분으로 FreeMem을 대체 해주면 문제가 해결되죠.

그런데 이렇게 pointer 변수가 null 을 가르키게 한다면 pointer 변수가 가르키고 있던 메모리는 garbage collection 되기 전까지 다시 사용하지 못합니다. 그래서 FreeMem 하여 메모리를 반환하고싶은데요, 방법이 있나요?



1  COMMENTS
  • Profile
    박정일 1999.08.27 22:11
    Lyle 께서 말씀하시기를...

    > build_command 라는 함수는 Pointer 를 리턴합니다. 이함수로부터 pointer를 전달받은 변수의 내용을 확인해보면 엉뚱한 것이 나오네요. 그이유가build_command의 마지막부분에 return 해준 Pointer에 할당된 메모리를 FreeMem으로 해지해주었기 때문인데요, 그래서 build_command 에서 return 하는 Pointer를 그냥 NIL 로 해주기만 하니까 build_command로부터 return 받은 변수값이 온전히 나오네요.

    >

    > function build_command(parameters..) : Pointer

    > var

    > dest : Pointer;

    > begin

    > dest := AllocMem(적당한 크기);

    > dest에 값을 채움

    >

    > return := dest;

    > FreeMem(dest);

    > //dest := NIL;

    > end;

    >

    > procedure test;

    > var

    > command : Pointer;

    > begin

    > command := build_command(parameters..);

    > command 의 값을 확인할 수 있는 code..

    > end;

    >

    > 이와같이 했을 때 test procedure가 return 값을 받았을 때는 이미 dest의 내용이 Free된 상태어서 쓰레기값이 나옵니다. 그래서 위에 주석부분으로 FreeMem을 대체 해주면 문제가 해결되죠.

    > 그런데 이렇게 pointer 변수가 null 을 가르키게 한다면 pointer 변수가 가르키고 있던 메모리는 garbage collection 되기 전까지 다시 사용하지 못합니다. 그래서 FreeMem 하여 메모리를 반환하고싶은데요, 방법이 있나요?

    >



    부산사는 사람입니다.

    아래와 같이 하면 될 것 같은데 ???



    function build_command : Pointer;

    var

    dest : Pointer;

    begin

    dest := AllocMem(4);

    strcopy(dest,'abc');

    Result := dest;

    end;





    procedure TForm1.Button1Click(Sender: TObject);

    var

    command : Pointer;

    begin

    command := build_command;

    Button1.Caption := StrPas(PChar(command));

    FreeMem(command);

    end;