是否需要手动释放由DllImport返回的IntPtr指向的字符串的内存?

时间:2012-04-25 11:19:34

标签: c# .net memory-management pinvoke dllimport

关于以下内容,我有几个问题:

[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. 如果不是,我如何释放内存?

1 个答案:

答案 0 :(得分:3)

此函数返回的字符串是静态分配的,您不需要释放该内存。这意味着您当前的代码已经完全符合您的需求。

这是一个开源项目,因此网络搜索会导致source code执行此功能以确认这一点。

顺便说一下,你的p / invoke是不正确的,尽管它是良性的。它应该是:

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

由于函数没有文本参数,因此无需指定CharSet。在任何情况下Ansi都是默认值,因此您仍然不需要指定它。通常,调用约定很重要,需要为所有LAME导入设置。对于没有参数的函数来说实际上并不重要,但是指定调用约定是一个很好的习惯。