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

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

这是一个开源项目,因此通过网络搜索可以找到实现此功能的源代码以确认这一点。

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

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

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

于 2012-04-25T11:22:57.717 回答