在C#中释放C分配的内存

本文关键字:分配 内存 释放 | 更新日期: 2023-09-27 18:25:14

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

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

CCD_ 1正在使用CCD_ 2来为CCD_ 3分配存储器。我已经尝试了几种从C#调用此函数的方法,但未能释放mystring。你能给我一些关于如何拨打foo()的指南吗?这样我以后就可以免费使用mystring了?

例如,如果char**StringBuilder[]表示,那么我如何使用它在free_string()中释放?

在C#中释放C分配的内存

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

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

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

匹配C#如下:

void GetString( StringBuilder buffer, int bufferSize );

如果在foo()1中使用LocalAlloc分配内存,则可以使用Marshal.FreeHGlobal(IntPtr)释放内存。尽管你不能用它释放malloc的内存。

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

还可以看看MSDN上关于内存模型的文章。