关于以下内容,我有几个问题:
[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;
}
pVersion
指向的字符串的内存在哪里?pVersion
超出范围时,是否会自动释放此内存?答案 0 :(得分:3)
此函数返回的字符串是静态分配的,您不需要释放该内存。这意味着您当前的代码已经完全符合您的需求。
这是一个开源项目,因此网络搜索会导致source code执行此功能以确认这一点。
顺便说一下,你的p / invoke是不正确的,尽管它是良性的。它应该是:
[DllImport("libmp3lame.dll", CallingConvention=CallingConvention.Cdecl)]
static extern IntPtr get_lame_version();
由于函数没有文本参数,因此无需指定CharSet
。在任何情况下Ansi
都是默认值,因此您仍然不需要指定它。通常,调用约定很重要,需要为所有LAME导入设置。对于没有参数的函数来说实际上并不重要,但是指定调用约定是一个很好的习惯。