COM 구성 요소에 MyDataObject 클래스가 있습니다. 다음 서명을하는 방법이있다 :COM 클래스 .NET에서 바이트 반환하기 - 메모리를 해제할지 여부
HRESULT MyDataObject::GetData(long Format, VARIANT* retval)
이 COM 개체는 .NET 응용 프로그램에서 사용하고 방법은 형식 값에 따라 두 문자열 또는 바이트 배열을 반환합니다. 반환 된 값은 .NET에서 byte []로 변환되어 사용됩니다.
이 메서드는 메모리 누수가 의심됩니다. 즉,이 메서드에서 반환 된 바이트 배열은 어떻게 든 해제해야합니다. 응용 프로그램을 디버깅 할 때 GetData (...) 메서드 호출이 각 호출에서 메모리를 차지하는 것을 볼 수 있습니다. 이 메모리를 확보하는 방법을 모르겠습니다. hGlobal으로 변경 한 다음 ReleaseHGlobal (...)을 호출하거나 다른 방법이 있습니까?
내가 샘플 응용 프로그램에서 사용되는 메모리 양을보고 작업 관리자를 사용하고,
예 업데이트되었습니다. 응용 프로그램을 시작하면 16MB로 유지되지만 GetData (...) 메서드를 약 850 번 호출하면 테스트 메모리가 증가하기 시작하고 TaskManager는 응용 프로그램의 메모리 사용량이 약 25MB 증가한 것으로 나타납니다.
원본 게시물에 세부 정보를 추가했습니다. 작업 관리자가 잘못된 인상을 주면 응용 프로그램의 올바른 메모리 사용을 모니터링하는 데 사용할 수있는 다른 도구에 대해 알고 있습니까? 또한 메서드가 주 응용 프로그램 (샘플이 아님)에서 호출되면 각 작업 (예 : 850 호출) 후에 메모리가 증가합니다 (TaskManager에서). 메모리가 내려 오지 않는 것 같아서이 COM 구성 요소가 메모리를 보유하고 있음을 의미합니다. 이것은 메모리 사용 측면에서 어플리케이션에 나쁜 인상을줍니다. – A9S6
나는 850 건 전화가 무엇을할지 모른다. 나는 * 정말로 * 백만을 의미했다. –
"CLR의 COM interop 계층은 이미 해당 값을 개체에 복사 한 후 변형을 해제합니다."...이 동작이 설명 된 일부 기사를 가리킬 수 있습니까? – A9S6