문제

C#에 com 래퍼가있는 코드가 있습니다. 이 COM 래퍼는 기본 C ++ 응용 프로그램에 사용됩니다. C ++ 코드는 C# 라이브러리에서 클래스의 인스턴스 배열을 반환하는 메소드를 사용합니다. 인스턴스는 SAFEARRAY에서 나옵니다.

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

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

    }

인스턴스 L에 할당 된 메모리를 자유롭게하고 싶지만 전화하면

free(l)

그런 다음 충돌이 발생합니다.

나는 시도했다

VariantClear ((VARIANT*)l);

그리고 사용

SafeArrayDestroy(array)

그러나 배열의 각 인스턴스에 대해 여전히 4 바이트가 누출되고 있습니다.

이 기억을 해제하는 방법은 어떻게해야합니까?

도움이 되었습니까?

해결책

이 코드는 약간 혼란스러워 보입니다. "Imyinterface의 크기"를 Malloc ()로 전달합니다. 이는 Imyinterface 인스턴스를 기억하는 크기가 될 것입니다. 포인터에 메모리를 할당하고 싶습니다.

그러나 그것을 보면, 그것은 말도 안됩니다. Malloc ()를 전혀하지 않는 것이 좋지 않습니까? SafeArrayGetElement ()에 대한 마지막 인수는 결과를 유지하는 메모리에 대한 포인터이므로 L (Malloc ()에 의해 반환 된 포인터)의 내용은 덮어 쓰기 (Free ()가 충돌하는 이유). 다시 말해, 이것은 작동해야합니다.

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

배열에 무엇이 있는지 정확히 알지 못하면 확실하지는 않지만, 포인터와 포인터의 차이의 구형 C/C ++ 문제에 의해 혼란스러워 보입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top