나는 COM 메모리 관리에 관한 몇 가지 질문이 : 나는 COM 방법이COM 메모리 관리
:
STDMETHODIMP CWhitelistPolicy :: GetWebsitesStrings을 (SAFEARRAY ** 결과)
을 결과 = SAFEARRAY (BSTR). 다른 인터페이스 메서드 (* 결과를 설정하기 위해)에서 또 다른 SAFEARRAY (BSTR)를 받으면 * 결과와 외부 클라이언트에 전달하기 위해받은 문자열의 복사본을 만들어야합니까? 또는 내가 직접 문자열을 클라이언트에 전달할 수 있고 (그리고 소유권을 전달하는) 문자열을 사용하지 않을 것이라고 생각하십니까?
STDMETHODIMP CWhitelistPolicy::SetWebsitesStrings(SAFEARRAY* input)
2.
여기서 I는 입력으로 BSTR 어레이를 수신한다. 다시 내 방법은 입력에 할당 된 메모리를 담당합니까?STDMETHOD(SetUsers)(SAFEARRAY* input);
3.
여기서 I는 다른 인터페이스 (SetUsers)의 메소드를 호출하고 I 입력 SAFEARRAY 메모리를 할당. SetUsers를 호출 한 후에는 SAFEARRAY를 처리 할 수 있습니까? 마샬링이 발생하면 메모리가 항상 복사됩니까? (내 경우에는 SetUsers 메서드가 내 프로세스 내에서 COM DLL로 호스팅되는 인터페이스에서 호출됩니다.)
나를 위해 좀 더 명확하게 :-) - 입력으로받은 모든 메모리 (호출자의 관점에서 볼 때)는 내 소유권에 있지 않습니다. 즉 서버 스텁의 작업입니다. 출력 (호출자의 관점에서 볼 때)으로 전달되는 모든 메모리는 내 소유입니다. 즉, 전달 된 메모리를 릴리스해야하는 메서드 호출 이후에 누수가 발생합니다. – Ghita
네가 준 경우에 그렇다. 들어오는 데이터를 수정하는 경우 [in, out] no. 들어오는 데이터를 수정하는 중입니다. 스텁은 호출자를 마샬링하기 전에 리턴 된 것을 해제하므로 들어오는 내용을 수정하려면 해방해야합니다. 나는 당신이 그것을 언제 잘못 생각하는지에 관한 다른 충고로 대답을 업데이트했다. –