【问题标题】:Free C allocated memory in C#在 C# 中释放 C 分配的内存
【发布时间】:2018-04-12 19:09:22
【问题描述】:

我有大量需要在 C# 中使用的 C 代码。示例:

long foo(char** mystring);
void free_string(char* mystring);

foo() 正在使用malloc()mystring 分配内存。我尝试了几种从 C# 调用此函数的方法,但我无法释放 mystring。您能否给我一些关于如何拨打foo() 的指导,以便我以后可以免费mystring

比如char**StringBuilder[]表示,那我怎么用free_string()中释放呢?

【问题讨论】:

  • 您究竟是如何调用 C 代码的?我们可以提供一些您尝试的示例代码吗?您的问题在目前的状态下太模糊,无法准确回答。
  • 在本机中分配内存以在托管中释放对于确保调用者确切知道他们在做什么会产生相当大的开销,您可能需要考虑在托管代码中分配内存的其他技术,例如像这样stackoverflow.com/questions/8425501/…
  • 我尝试以多种方式调用 C 代码,但我对其中任何一种都没有信心。例如:我试过'static extern long foo([MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.LPStr)] StringBuilder[] mystring);'我尝试使用“IntPtr ptr”而不是“StringBuilder”和 Marshal.FreeCoTaskMem(ptr)。它不起作用

标签: c# c memory-management interop


【解决方案1】:

在本机中分配内存以在托管中释放会导致调用者确切知道他们在做什么方面的开销很大,您可能需要考虑在托管代码中分配内存的其他技术。

一个例子可能是对托管代码进行回调以获取字符串缓冲区

extern "C" __declspec void GetString( char* buffer, int bufferSize );

匹配的 C# 如下:

void GetString( StringBuilder buffer, int bufferSize );

【讨论】:

    【解决方案2】:

    如果您在kernel32.dll 中使用LocalAlloc 分配内存,那么您可以使用Marshal.FreeHGlobal(IntPtr) 释放它。虽然你不能用它来释放 malloc 的内存。

    作为另一种解决方案,考虑传递 C# StringBuilder 引用并用 C 代码填充它。

    也可以看看MSDN article on memory models

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多