ネイティブコードの.NET関数から返されたSafearrayを削除するにはどうすればよいですか?
-
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
. 。私はもう試した delete
と delete[]
記述子とPVDATAメンバーの両方で、これは常に失敗します。私はしようとしました SafeArrayDestroy()
記述子は、成功しますが、ヒープを破壊します。電話することができます SafeArrayDestroyData()
の上 variant.parray->pvData
これは正常に機能しますが SafeArrayDestroyDescriptor()
再びヒープを破壊します。私はまだ配列の記述子を漏らしています。
それでは、Safearrayの記述子を扱い、このメモリリークをプラグインするにはどうすればよいですか?
解決
コードを表示せずに推測することは不可能です。とにかくヒープはずっと前に破損していたかもしれません。
variantClear()を使用する必要があります。
所属していません StackOverflow