2012-10-31 3 views
5

Delphi XE를 사용하고 있습니다. Delphi Soap을 사용하여 메모리 누수 문제가 발생했습니다. 그것은 내가 가진 문제는 QC 91160TWSDLLookup.Destroy 메서드의 Delphi XE 메모리 누수

에 설명 된대로 인해 TWSDLLookup.Destroy에서 누락 된 파울 콜에 의한 것으로 판명 해결 방법은 TWSDLLookup.Destroy 방법에 FLookup.Free를 추가하는 것입니다있는 설명했다.
나는 델파이 소스를 바꾸고 싶지 않아서 프로젝트 폴더에 유닛을 복사하려고 시도했다. 변경과 재 컴파일은 톰의 답변에 here과 같이 기술되어있다. 이 기술의 문제점은 모든 종속 유닛을 다시 컴파일하는 경우에만 작동한다는 것입니다. 내 프로젝트 디렉토리에 그냥 WSDLLookup.pas 복사를 시도하고 Stackoverflow 오류가 발생합니다. 나는 웹 서비스/SOAP에 익숙하지 않기 때문에이 기술을 사용하면 다른 단위를 복사해야할지 모르겠다.

같은 페이지에서 Rob Kennedy의 대답은 코드 후킹과 관련된 다른 기술을 설명하지만 객체 메소드에는 적용되지 않는 것으로 보입니다. 그가 TNT 유니 코드 컨트롤에 대한 무료 코드를 제안하고 다운로드 한 것처럼 관련 절차를 찾았지만 객체의 메서드를 연결하는 방법에 대한 정보를 찾을 수 없었습니다. 실제로 가능하면 가능합니다. 이 작업을 수행 할 수 있다면 TWSDLLookup.Destroy을 연결하고 FLookup.Free 호출을 추가합니다.

이 문제를 해결하는 방법에 대한 아이디어는 크게 환영 할 것입니다. 나는 약간의 초보자 프로그래머이므로 뭔가 확실한 것을 놓쳤다 고 생각하니?

답변

3

당신이하려는 것은 실제로 잘 작동합니다. 나는 그것을 스스로 테스트했다. 여기 내가 사용하는 프로젝트 파일입니다 :

program WSDLLookupTest; 

{$APPTYPE CONSOLE} 

uses 
    WSDLLookup in 'WSDLLookup.pas'; 

var 
    intf: IInterface; 

begin 
    intf := GetWSDLLookup as IInterface; 
end. 

은 내가 WSDLLookup.pas 파일의 복사본을 만들어 엑 파일과 같은 디렉토리에 배치. 그런 다음 원본보다 복사본에서 TWSDLLookup.Destroy을 수정했습니다.

destructor TWSDLLookup.Destroy; 
begin 
    Beep; 
    ClearWSDLLookup; 
    FLookup.Free; 
    inherited; 
end; 

는이 코드가 실제로 실행되는 것을 자신에게 증명하기 위해 Beep을 추가했다.

귀하의 입장에서 나는 코드 훅을 시도하는 대신이 해결책을 확실히 사용할 것입니다. 물론 다른 간단한 솔루션은 최신 델파이 버전으로 업그레이드하는 것입니다.

업그레이드 할 때 수정 된 장치를 제거하는 것을 잊지 마십시오. 누수가 XE2에서 수정되었습니다.

+0

답장을 보내 주셔서 감사합니다 :) –

+0

디버그 디버거를 사용하면 문제가 발생할 수 있습니다. 아마 스택 오버플로가 발생할 수 있습니다. 아니면 다른 버그가있을 수도 있습니다. –

+0

어쨌든 다시 고마워. 작동하지 않기 때문에, 내가 뭘 잘못하고 있는지 찾아 보겠습니다 :) –