0

com ラッパーを持つ C# のコードがいくつかあります。この 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

このコードは少し混乱しているように見えます。malloc()に「sizeofIMyInterface」を渡しています。これは、IMyInterfaceのインスタンスのメモリ内のサイズであり、ポインタではありません。「sizeofIMyInterface*」を意味する場合があります。ポインタにメモリを割り当てたい。

ただし、それを見ると、それも意味がありません。malloc()をまったく実行しない方がよいのではないでしょうか。SafeArrayGetElement()の最後の引数は、結果を保持するメモリへのポインタであるため、lの内容(malloc()によって返されるポインタ)は上書きされます(これがfree()がクラッシュする理由です)。言い換えれば、これだけでうまくいくはずです:

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

配列の内容を正確に知らなければ、確認するのは簡単ではありませんが、ポインターとポインターが指すオブジェクトの違いに関する古いC /C++の問題に混乱しているようです。

于 2008-11-05T17:34:47.927 に答える