gpt4 book ai didi

c# - 在托管 C# 中释放非托管 c 代码内存

转载 作者:IT王子 更新时间:2023-10-28 23:37:48 27 4
gpt4 key购买 nike

我有一个大型 c 代码库,用于将其结果写入文件。我将其转换为通过 float* 数组将其数据返回到这样的 C++ 程序(以避免常量文件 I/O):

float* mgrib(...)

这在 C++ 中运行良好,我可以“释放”内存。我设法通过以下方式将数据正确导入 C#:

IntPtr pointer = mgrib(...);
float[] result = new float[ size ];
Marshal.Copy( pointer, result, 0, size );
Marshal.FreeCoTaskMem( pointer );

这是一个循环,因为必须从函数中提取许多字段。如果它少于 256 个字段,则效果很好。如果它更多,它会在没有警告的情况下崩溃。如果我通过它正确运行一个文件,然后运行另一个(总计超过 256 个)它会崩溃。我远非 CS 专家,但 256 似乎不仅仅是巧合。

我感谢任何见解。谢谢。

最佳答案

首先,您确定 C++ 库使用 CoTaskMemAlloc 分配返回值缓冲区,以便您可以使用 Marshall.FreeCoTaskMem 释放它吗?有various memory (de)allocation functions而且你不能随意混合它们。

这就是为什么库经常被设计为“单边”分配和释放内存的原因,例如使用类似的东西

void mgrib(..., float *buff, int buffsize);

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

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