C#コードからアンマネージC++コードを呼び出すと、メモリリークが発生するようです。
C++は、ifstream.readを使用してファイルからデータを読み取り、それをVectorに書き込みます。Windows 7のマネージコードからアンマネージコードを呼び出すとメモリリークが発生する
これはWindows 7にアップグレードした後に起こります。Vistaでは発生しませんが、VistaでコンパイルされたネイティブDLLのバージョンを使用しても何も変更されません。
同じC++コードを直接実行し、管理対象の介入なしでメモリリークは発生しません。
管理プロセスを実行してもvshostプロセス内で実行すると、メモリリークは発生しません。
[DllImport(DllPath, CharSet = CharSet.Unicode)]
[return: MarshalAs(UnmanagedType.I1)]
public static extern bool MyMethod(
int x,
string y,
string z,
bool v,
bool w);
とネイティブ1::私はC++から呼び出す
MyDll_Export bool APIENTRY MyMethod(
int x,
const wchar_t* y,
const wchar_t* z,
bool v,
bool w)
が、私はこのようにそれを呼び出す:
MyMethod(1, L"My String 1", L"My String 2", true, true)
私をここ
は、コールサインですマネージド・メモリとアンマネージ・メモリのパフォーマンス・カウンタを見ると、すべてのメモリがアンマネージ・コードに由来することがわかります。マーシャリングが非常に単純であることを考慮すると、なぜC++を直接呼び出すかC#を呼び出すかの違いが理解できません。
私はなぜこれがWindows 7(両方のWindowsインストールで.net 3.5 SP1を使用していた)でのみ起こるのかわかりません。
誰にでもこの理由が考えられますか?
また、誰かがWindows 7で動作するネイティブメモリプロファイリングツールを知っていれば、私は喜んでいるはずです(今のところ、すべての明示的なメモリ割り当てをコンソールに出力していて、違いはありません)。
LeakDiag [http://mcfunley.com/277/using-leakdiag-to-debug-unmanaged-memory-leaks]またはAutomatedQAのAQTimeは、アンマネージドリーク解析を実行できます。 –
メモリ消費量を測定するパフォーマンスカウンタはどれですか? –
"vshost.exe"という質問にタグを付けました。メモリ消費量を測定すると、アプリケーションはVisual Studioで実行されますか? –