Q&A

  • 메모리 문제(소스포함.) FreeMem을 사용해야할 때?
안녕하세요.

델파이를 시작한지 얼마되지 않는 델초가 고수님께 도움을 요청합니다.

아래 소스는 음성 채팅에서 Winshoes로 음성 데이터를 입력받는 부분입니다.

개별 Compile을 할 경우에는 Error가 발생하지 않는데 Server로 부터 입력을 받도록 2개의 프로그램을 구동하면 Free를 시켜주지 못해서 Error가 발생하는 것 같습니다.

어제 하루종일 생각하다 해결을 못하고 이렇게 질문을 올립니다.

FreeMem구문은 버퍼를 다 사용한 뒤에 사용해야 된다는 것은 알 겠는데 구체적으로 어떻게 해야 될지????

Free를 시켜주기 위해서는 아래 소스를 어떤식으로 수정해야 되는지 알고싶습니다.

(질문을 위해서 source를 약간 수정했습니다.)



고수님들의 조언을 바라는 델초.....

미리 인사드립니다. 감사합니다.

그럼. 20000.





procedure TPlayer.UDPClientListenerUDPRead(Sender: TObject; const psData,

psPeer: String; const piPort: Integer);

var

tempMem : PChar;

begin

if FDeviceOpened = true then begin

GetMem(tempMem, WAVE_BUFSIZE);

try

if length(trim(psData)) > 0 then begin

tempMem := PChar(psData); // Server로 부터 음성입력.

OutWaveMem[OutBufIndex] := tempMem;

//OutWaveMem은 전역변수(array [0..3] of PChar).=> circular buffer를 사용.

FWaveOutOpened := true;

end;



if FWaveOutOpened then begin

QueueNextBuffer; //음성출력루틴을 포함하고 있는 procedure.

FWaveOutOpened := false;

end;

finally

FreeMem(tempMem); // 이 부분.???

end;

end

end;

1  COMMENTS
  • Profile
    최용일 2000.08.27 00:37
    안녕하세요. 델파이세상(http://www.freechal.com/delphiworld)의 최용일입니다.



    조금 이상하군요.... GetMem으로 메모리 블럭을 할당받은후에 바로 psData를 대입해



    버리는 군여. 그럼 할당받은 메모리 블럭을 잃어버리는데요. 메모리릭이 생깁니다.



    StrCopy, Move같은 함수를 사용해서 복사를 해주어야합니다.



    이런것은 컴파일할때는 에러가 나지 않습니다. 문법적으로는 문제가 없으니까요...



    ^^ 항상 즐코하세요.



    김용민 wrote:

    > 안녕하세요.

    > 델파이를 시작한지 얼마되지 않는 델초가 고수님께 도움을 요청합니다.

    > 아래 소스는 음성 채팅에서 Winshoes로 음성 데이터를 입력받는 부분입니다.

    > 개별 Compile을 할 경우에는 Error가 발생하지 않는데 Server로 부터 입력을 받도록 2개의 프로그램을 구동하면 Free를 시켜주지 못해서 Error가 발생하는 것 같습니다.

    > 어제 하루종일 생각하다 해결을 못하고 이렇게 질문을 올립니다.

    > FreeMem구문은 버퍼를 다 사용한 뒤에 사용해야 된다는 것은 알 겠는데 구체적으로 어떻게 해야 될지????

    > Free를 시켜주기 위해서는 아래 소스를 어떤식으로 수정해야 되는지 알고싶습니다.

    > (질문을 위해서 source를 약간 수정했습니다.)

    >

    > 고수님들의 조언을 바라는 델초.....

    > 미리 인사드립니다. 감사합니다.

    > 그럼. 20000.

    >

    >

    > procedure TPlayer.UDPClientListenerUDPRead(Sender: TObject; const psData,

    > psPeer: String; const piPort: Integer);

    > var

    > tempMem : PChar;

    > begin

    > if FDeviceOpened = true then begin

    > GetMem(tempMem, WAVE_BUFSIZE);

    > try

    > if length(trim(psData)) > 0 then begin

    > tempMem := PChar(psData); // Server로 부터 음성입력.

    > OutWaveMem[OutBufIndex] := tempMem;

    > //OutWaveMem은 전역변수(array [0..3] of PChar).=> circular buffer를 사용.

    > FWaveOutOpened := true;

    > end;

    >

    > if FWaveOutOpened then begin

    > QueueNextBuffer; //음성출력루틴을 포함하고 있는 procedure.

    > FWaveOutOpened := false;

    > end;

    > finally

    > FreeMem(tempMem); // 이 부분.???

    > end;

    > end

    > end;