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

本文关键字:IntPtr 内存 字符串 返回 DllImport 释放 是否 | 更新日期: 2023-09-27 18:32:16

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

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

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

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

这是一个开源项目,因此网络搜索会导致实现此函数的源代码以确认这一点。

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

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

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