質問

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バイトがリークしています。

このメモリを解放する方法はありますか?

役に立ちましたか?

解決

このコードは少し混乱しているように見えます:&quot; sizeof IMyInterface&quot;を渡していますmalloc()へのポインタは、IMyInterfaceのインスタンスのメモリ内のサイズになります。つまり、「sizeof IMyInterface *」を意味するかもしれません。ポインタにメモリを割り当てたい場合。

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

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top