2008-11-05 14 views
0

com 래퍼가있는 C# 코드가 있습니다. 이 com 래퍼는 네이티브 C++ 응용 프로그램에서 사용됩니다. C++ 코드는 C# 라이브러리에서 클래스의 인스턴스 배열을 반환하는 메서드를 사용합니다.SafeArrayGetElem 호출에서 사용 가능한 메모리가 있습니까?

for (long i =min; i<=max;i++) 
    { 
     IMyInterface *l = (IMyInterface *)malloc(sizeof IMyInterface); 

     SafeArrayGetElement(array,&i, &l); 
    <other code> 

    } 

내가 인스턴스 리터에 할당 된 메모리를 해제하기를 원하지만 그때

free(l) 

를 호출하면 나는 충돌을 얻을 : 인스턴스 그래서 같은 SafeArray는에서 온다.

나는

VariantClear ((VARIANT*)l); 

SafeArrayDestroy(array) 

를 사용을 시도했지만 여전히 배열의 각 인스턴스에 대해 4 바이트를 유출하고있다.

이 메모리를 확보하는 방법에 대한 아이디어가 있습니까?

답변

0

이 코드는 "sizeof IMyInterface"를 malloc()에 전달합니다.이 크기는 포인터가 아니라 IMyInterface 인스턴스의 메모리 크기가됩니다. "sizeof IMyInterface * "포인터를위한 메모리를 할당하려는 경우.

그러나 그것을 보면, 전혀 이해가되지 않습니다. malloc()을하지 않는 것이 더 좋지 않습니까? SafeArrayGetElement()의 마지막 인수는 결과를 보유 할 메모리에 대한 포인터이므로 l (malloc()에 의해 반환 된 포인터)의 내용이 덮어 쓰여집니다 (free()가 충돌을 일으키는 이유).

IMyInterface *l; 
SafeArrayGetElement(array,&i, &l); 

배열에, 그것을 확인하기 위해 쉬운 일이 아닙니다 있는지 정확히 모른 채, 그러나 당신이 그 차이의 기존 C/C++ 문제로 혼란스러워지고있어 다음과 같습니다 즉, 그냥이 작동합니다 포인터와 포인터가 가리키는 개체 사이.

+0

고마워, 내가 읽었던 부분은 복사 할 요소에 대한 메모리를 할당하는 것이 사용자의 책임이라는 말을했지만 실제로는 효과가있는 것으로 보인다. –

+0

배열에 포인터가 4 바이트 밖에 없으므로 포인터 변수의 주소를 스택에 전달하는 것으로 충분합니다. 설명서가 약간 잘못되었을 수도 있습니다. 배열에 더 큰 객체가 있으면 필요한만큼의 메모리를 할당해야합니다. – DavidK