0

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

任何想法我应该如何去释放这个记忆?

4

1 回答 1

0

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

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

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

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

于 2008-11-05T17:34:47.927 回答