gpt4 book ai didi

.net - 从托管代码中释放非托管内存分配

转载 作者:行者123 更新时间:2023-12-04 09:16:42 26 4
gpt4 key购买 nike

.NET 应用程序调用 C dll。 C 代码为 char 数组分配内存并返回该数组作为结果。 .NET 应用程序将此结果作为字符串获取。

C代码:

extern "C" __declspec(dllexport) char* __cdecl Run()
{
char* result = (char*)malloc(100 * sizeof(char));
// fill the array with data
return result;
}

C# 代码:
[DllImport("Unmanaged.dll")]
private static extern string Run();

...
string result = Run();
// do something useful with the result and than leave it out of scope

对它的一些测试表明垃圾收集器不会释放 C 代码分配的内存。

任何帮助将不胜感激。 :)

最佳答案

托管字符串与 char* 不同。 secret 发生的是互操作层中的编码代码复制非托管字符串以将其转换为托管字符串,但它无法释放该内存,因为它不知道它是如何分配的。

但是,您可以尝试分配和返回 BSTR 而不是 char*。与经典的非托管数据类型相比,互操作层更好地处理自动化数据类型。

重要的原因是 char* 和 BSTR 在内存中的分配方式。

char* 缓冲区是使用 CLR 不知道的私有(private)分配/释放例程在 C++ 运行时的堆上分配的,因此它无法删除该内存。更糟糕的是,char* 指向的缓冲区可以由 dll 代码的内部堆实现分配,或者它甚至可能指向私有(private)类中的成员变量。

另一方面,BSTR 使用 WIndows API SysAllocString 分配并由 SyFreeStirng 释放,并且由于 CLR 互操作层知道这些 Windows API,它知道如何释放从非托管代码中获得的 BSTR。

关于.net - 从托管代码中释放非托管内存分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1932365/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com