メモリリークを呼び出す時にポコードからコンポーネントはWindows7
-
19-09-2019 - |
質問
時を呼んでポリシーのC++コードから私C#コードでは、い何らかのメモリリークを引き起こします。
C++を読み込みファイルからデータを用いifstream.読み書きするベクトルの役割を果たします。
このみアップグレードした後、インストールして、Windows7んなwindows Vistaものを利用した場合、バージョンのネイティブdllためのwindows Vistaされているとは思いませんが、変更がふさわしいか決めるんだよ。
場合も同じC++のコードを直接、管理interopeありませんメモリリーク!
場合の実行管理過程の範囲内で、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);
のネイティブ。
MyDll_Export bool APIENTRY MyMethod(
int x,
const wchar_t* y,
const wchar_t* z,
bool v,
bool w)
呼び出すC++から、javascriptの名前空間に、私はこのようになります:
MyMethod(1, L"My String 1", L"My String 2", true, true)
さんのカウンターのための管理およびポメモリは、すべてのメモリからのポリシーのコードです。
その総力を結集するイラストはピアプロかわからないのはなぜ"の間には大きな違いがあり、C++を直接またはC#.
でもなぜかうことが起こるだけでWindows7の場合(Windowsの設置した。純3.5SP1).
小さなアイデアをお持ちの理由です。
ものなら誰でも知ってネイティブなメモリプロファイリングツール上で動作する画面7,さんに嬉しい知(在いただきました、印刷したコンソールのすべての明示的なメモリ割り当て、違いはありません).
解決
私は、問題は、そのC ++カウンターパートにC#のデータ型をマーシャリングに関連していると確信しています。あなたが署名した1つのバイトの値に戻り値ブール値をマーシャリングしているので、多分あなたは、関数の引数に同じことを行う必要がありますか? C#のbool型は、多分あなたがリークしている、4バイトのですか?
また、文字列の非管理型を指定することは役立つかもしれません。
[DllImport(DllPath, CharSet = CharSet.Unicode)]
[return: MarshalAs(UnmanagedType.I1)]
public static extern bool MyMethod(
int x,
[MarshalAs(UnmanagedType.LPWStr)]
[In] string y,
[MarshalAs(UnmanagedType.LPWStr)]
[In] string z,
[MarshalAs(UnmanagedType.I1)]
bool v,
[MarshalAs(UnmanagedType.I1)]
bool w);
commentorの説明:
一般的に、ゼロまたはヌルポインタ 値は、偽の他に変換され、 値がtrueに変換されます。
...
1998 C ++標準ライブラリの定義 ベクトルの専門 BOOLためのテンプレート。の説明 クラスがあることを示し 実装は、梱包すべきです 要素ごとにしか用途がBOOLように、 メモリの1ビットます。
だから、かなり多く使用どのような値、あなたは真または偽の値を持つC ++ブール値を取得します。
他のヒント
残念ながらまる文字列は、整列化は簡単です。
私たちが発展していくために必要なデータのために、ウェブサイトの広告を表します。で提供する以下の
- ネイティブメソッドの署名
- どのように、メモリ内の文字列の管理にネイティブコードについて教えてください。
- おそらくC++サンプルをご利用のAPI?
編集
次のことを試してみてください署名を表します。これは、CLRな整理メモリの両方向でのみのデータです。
[DllImport(DllPath, CharSet = CharSet.Unicode)]
[return: MarshalAs(UnmanagedType.I1)]
public static extern bool MyMethod(
int x,
[In] string y,
[In] string z,
bool v,
bool w);
私は<のhref = "http://www.microsoft.com/downloads/details.aspx?familyid=86ce6052-d7f4-4aeb-9b7a-94635beebdda&displaylang=en" のrel = "nofollowをnoreferrer" の使用を発見しました>私のメモリリークを見つけたときにCLRプロファイラは役に立ちを。
あなたはメモリリークがあることを確認していますか?
メモリリークを決定するためのあなたの根拠は何ですか。あなたはパフォーマンスカウンタからそれを見ることができると言うが、あなたは実際に何を守っていますか?あなたはハイレベルに落ち着くconinously上昇カーブ、または1を参照していますか?高いメモリ消費量は、多くの場合、メモリリークのために混乱してます。
ところで。あなたにも、あなたにC ++の関数定義を投稿することができますか?