2010-06-21 3 views
1

COM 구성 요소에 MyDataObject 클래스가 있습니다. 다음 서명을하는 방법이있다 :COM 클래스 .NET에서 바이트 반환하기 - 메모리를 해제할지 여부

HRESULT MyDataObject::GetData(long Format, VARIANT* retval) 

이 COM 개체는 .NET 응용 프로그램에서 사용하고 방법은 형식 값에 따라 두 문자열 또는 바이트 배열을 반환합니다. 반환 된 값은 .NET에서 byte []로 변환되어 사용됩니다.

이 메서드는 메모리 누수가 의심됩니다. 즉,이 메서드에서 반환 된 바이트 배열은 어떻게 든 해제해야합니다. 응용 프로그램을 디버깅 할 때 GetData (...) 메서드 호출이 각 호출에서 메모리를 차지하는 것을 볼 수 있습니다. 이 메모리를 확보하는 방법을 모르겠습니다. hGlobal으로 변경 한 다음 ReleaseHGlobal (...)을 호출하거나 다른 방법이 있습니까?

내가 샘플 응용 프로그램에서 사용되는 메모리 양을보고 작업 관리자를 사용하고,
업데이트되었습니다. 응용 프로그램을 시작하면 16MB로 유지되지만 GetData (...) 메서드를 약 850 번 호출하면 테스트 메모리가 증가하기 시작하고 TaskManager는 응용 프로그램의 메모리 사용량이 약 25MB 증가한 것으로 나타납니다.

답변

1

CLR의 COM interop 계층은 이미 값을 개체에 복사 한 후 변형을 해제합니다. Marshal.FreeCoTaskMem()을 호출 할 수는 없지만 원본 변형을 참조 할 수는 없습니다.

메모리 누수가 발생했다고 결론을 냈습니다. Taskmgr.exe를 사용하지 마십시오. 잘못된 인상을줍니다. 작은 테스트 프로그램에서이 방법을 수백만 번 호출하여 실제 누수가 있는지 확인하십시오. 메모리 사용이 제한없이 증가하지 않고 결국 OOM이 발생하면 실제 누수가 발생하지 않습니다. 충돌이 발생하면 COM 서버에 누출이 의심됩니다. 문자열과 배열을 모두 할당하는 것과 마찬가지로 하나만 반환하는 것과 같습니다.

+0

원본 게시물에 세부 정보를 추가했습니다. 작업 관리자가 잘못된 인상을 주면 응용 프로그램의 올바른 메모리 사용을 모니터링하는 데 사용할 수있는 다른 도구에 대해 알고 있습니까? 또한 메서드가 주 응용 프로그램 (샘플이 아님)에서 호출되면 각 작업 (예 : 850 호출) 후에 메모리가 증가합니다 (TaskManager에서). 메모리가 내려 오지 않는 것 같아서이 COM 구성 요소가 메모리를 보유하고 있음을 의미합니다. 이것은 메모리 사용 측면에서 어플리케이션에 나쁜 인상을줍니다. – A9S6

+0

나는 850 건 전화가 무엇을할지 모른다. 나는 * 정말로 * 백만을 의미했다. –

+0

"CLR의 COM interop 계층은 이미 해당 값을 개체에 복사 한 후 변형을 해제합니다."...이 동작이 설명 된 일부 기사를 가리킬 수 있습니까? – A9S6

관련 문제