質問

時を呼んでポリシーの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の説明:

C ++ bool型の場合:

  

一般的に、ゼロまたはヌルポインタ   値は、偽の他に変換され、   値が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 ++の関数定義を投稿することができますか?

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