1

次の点についていくつか質問があります。

[DllImport("libmp3lame.dll", CharSet = CharSet.Ansi)]
static extern IntPtr get_lame_version();

public static string GetLameVersion()
{
    IntPtr pVersion = get_lame_version();
    string version = Marshal.PtrToStringAnsi(pVersion);
    return version;
}
  1. が指す文字列のメモリはどこにpVersion割り当てられていますか?
  2. pVersionこのメモリは、範囲外になると自動的に解放されますか?
  3. はいの場合、それはどのように起こりますか?
  4. いいえの場合、メモリを解放するにはどうすればよいですか?
4

1 に答える 1

3

この関数によって返される文字列は静的に割り当てられるため、そのメモリを解放する必要はありません。これは、現在のコードがまさに必要としているものであることを意味します。

これはオープン ソース プロジェクトであるため、Web 検索を行うと、この機能を実装するためのソース コードが表示され、これを確認できます。

余談ですが、良性ではありますが、あなたの p/invoke は正しくありません。そのはず:

[DllImport("libmp3lame.dll", CallingConvention=CallingConvention.Cdecl)]
static extern IntPtr get_lame_version();

CharSet関数にはテキスト パラメーターがないため、指定する必要はありません。いずれにしてもAnsiがデフォルトであるため、指定する必要はありません。一般に、呼び出し規約は重要であり、すべての LAME インポートに対して設定する必要があります。パラメーターのない関数の場合は実際には問題になりませんが、呼び出し規約を指定することは、慣れるのに適した習慣です。

于 2012-04-25T11:22:57.717 に答える