2012-04-25 13 views
1

私は、次に関する質問のカップルを持っている:DllImportによって返されたIntPtrが指す文字列のメモリを手動で解放する必要がありますか?

文字列のメモリが割り当てられ pVersionによって指される
[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. はいの場合、どうなりますか?
  3. いいえの場合、メモリを解放するにはどうすればよいですか?
+0

1.呼び出すライブラリによって異なります。 2.呼び出すライブラリによって異なります。 3.呼び出すライブラリによって異なります。 4.呼び出すライブラリによって異なります。 ... – Nick

+0

@Nick、説明できますか? –

+0

APIと同様に、誰がメモリ割り当てと割り当て解除を担当するのかを知る必要があります。これは、ドキュメンテーションを通じて、または問題の図書館のソースコードを見ることによって行われます。 – Nick

答えて

3

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

これはオープンソースプロジェクトなので、websearchはsource codeに進み、これを確認します。

p/invokeは間違いですが、良性ですが、間違っています。それは次のようになります。

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

機能にテキストパラメータを持っていないのでCharSetを指定する必要はありません。どんな場合でもAnsiがデフォルトですので、それを指定する必要はありません。通常、呼び出し規約は重要であり、すべてのLAMEインポートに対して設定する必要があります。パラメータを持たない関数では実際には関係ありませんが、呼び出し規約を指定するのは良い取り組みです。

+0

したがって、DLLがロードされている限り、文字列のメモリ割り当ては静的に維持されますか? –

+0

はい、正しいです。私はすべての疑問を超えてそれを示すソースコードへのリンクを追加しました。 –

関連する問題