ネイティブコードの.NET関数から返されたSafearrayを削除するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/5333603

  •  26-10-2019
  •  | 
  •  

質問

徹底的なリストではありませんが、次の方法を使用してC ++プログラムで.NETライブラリをホストしています。

CorBindToRuntimeEx()
GetDefaultDomain()
CreateInstance()
GetIDsOfNames()

そして最終的には呼びかけます Invoke().

これは十分に機能しますが、.NET関数が次のような配列を返すたびにメモリを漏らしています。

public int[] getArray() { int[] i = { 0, 1, 2, 3 }; return i; }

この場合、関数はaを返します VARIANT タイプの VT_SAFEARRAY|VT_I4. 。私はもう試した deletedelete[] 記述子とPVDATAメンバーの両方で、これは常に失敗します。私はしようとしました SafeArrayDestroy() 記述子は、成功しますが、ヒープを破壊します。電話することができます SafeArrayDestroyData() の上 variant.parray->pvData これは正常に機能しますが SafeArrayDestroyDescriptor() 再びヒープを破壊します。私はまだ配列の記述子を漏らしています。

それでは、Safearrayの記述子を扱い、このメモリリークをプラグインするにはどうすればよいですか?

役に立ちましたか?

解決

コードを表示せずに推測することは不可能です。とにかくヒープはずっと前に破損していたかもしれません。

variantClear()を使用する必要があります。

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