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 하여 메모리를 반환하고싶은데요, 방법이 있나요?
> 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;