我在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个字节。

我应该如何释放这段记忆?

有帮助吗?

解决方案

这段代码看起来有点混乱:你传递的是“sizeof IMyInterface”。到malloc(),它将是IMyInterface实例的内存大小,而不是指向它的指针:你可能意味着“sizeof IMyInterface *”如果你想为指针分配内存。

然而,看着它,这也没有任何意义:你最好不去做malloc()吗? SafeArrayGetElement()的最后一个参数是一个指向将保存结果的内存的指针,因此l(malloc()返回的指针)的内容将被覆盖(这就是free()让你崩溃的原因)。换句话说,这应该工作:

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

在不确切知道数组中的内容的情况下,确定并不容易,但看起来您对指针与它们指向的对象之间差异的旧C / C ++问题感到困惑。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top