2010-01-08 4 views
-1

메모리가 누수되는 이벤트 지원이있는 자동화 개체가 있습니다. 생성 된 소스와 함께 제공되는 FConnectionPoints는 절대로 해제되지 않습니다. 소멸자에 수동으로 FConnectionPoints.Free를 추가하면 누설이 사라집니다.자동화 개체 누수 메모리 (TConnectionPoints)

저는 Delphi 7에서 FastMM BorlandMM.dll과 FastMM_Fulldebugmode.dll을 사용하고 있습니다.

단계 재현 :

  1. 새로운 자동화 개체 추가 새 ActiveX 라이브러리 프로젝트 시작 : 이름 = TestObject를; "이벤트 지원 코드 생성"을 확인하십시오.
  2. TypeLibrary를 열고 ITestObject에 메서드를 추가하고 ITestObjectEvents에 이벤트를 추가하십시오.
  3. 새로 고침, 코드가 생성됩니다.
  4. 저장, 컴파일하고 등록하여 .DPR 파일의 첫 번째 단위로 반드시 ShareMem 추가하기이 ActiveX 서버 (실행 메뉴)
  5. 시작 새로운 응용 프로그램 프로젝트 당신의 .DPR의 첫 번째 단위로 반드시 ShareMem을 넣어
  6. 가져 오기 형식 라이브러리 장치를 파일 : 당신은 그냥 6 단계에서 만든 DLL에서 장치를 만들고, FormCreate에서
  7. 을 "구성 요소 래퍼를 생성"체크 추가 다음 코드 :
,

코드 :

var 
    lTest: TTestObject; 
begin 
    lTest := TTestObject.Create(nil); 
    try 
    lTest.ConnectKind := ckNewInstance; 
    lTest.Connect; 
    lTest.Disconnect; 
    finally 
    lTest.Free; 
    end; 
end; 

지금 실행, 컴파일하고이 응용 프로그램을 닫습니다. 기억 상실이보고됩니다.

질문 :

, 나는가 someting 잘못 델파이 코드 템플릿의 버그 일을 오전이, 아니면이 (도움이 그것을 언급하지 않는) 자신 무료 FConnectionPoints에 의도?

답변

0

이 문제는 품질 센터 report #1480에보고 된 것으로 나타났습니다.

시삽이 새로운 보고서를 작성하도록 요청 했으므로 : report #81288.

또한 내 질문에 대한 답변 : 이것은 코드 템플릿의 버그입니다.

1

자동화 개체로 작업 한 적은 없지만 IConnectionPoint이 인터페이스라는 것을 알기까지 나는 완전히 질문을 이해하지 못합니다. 델파이의 인터페이스는 참조가 계산됩니다 (구현이 TInterfacedObject, TContainedObject 또는 TAgreggatedObject을 상속하거나 이에 따라 _AddRef_Release을 구현하는 경우), 따라서 메모리 누수가 없어야합니다.

인터페이스에 대한 자세한 내용은 article을 참조하십시오.

chapter from the Delphi Language Guide도 도움이 될 수 있습니다.

+0

TConnectionPoints는 인터페이스 된 개체가 아니며 TObject를 상속 한 개체입니다. FConnectionPoints는 IConnectionPointContainer를 구현하는 속성으로 반환됩니다. –