【发布时间】:2016-02-27 00:58:47
【问题描述】:
我正在从我的 C# 程序中调用一个 c++ dll。看来,一旦将变量传递给非托管代码,C# 就不想与它有任何关系,因此我的程序正在疯狂地泄漏内存。
这是代码的 C# 部分:
byte[] bytes = MyData;
int array_lenght = bytes.Length;
DataProcessor(bytes, array_lenght);
DataProcessor 定义为
[DllImport("Processor", EntryPoint = "DataProcessor")]
public static extern void DataProcessor(byte[] array, int ArrayElementCount);
这是 DataProcessor 函数的 DLL 端:
void DataProcessor (uint8_t* InputArray, int ArrayElementCount)
// do some stuff here
现在看来我需要从 DLL 中删除这个数组(InputArray),但是我找不到这样做的方法。我试过像
delete *(InputArray + i) // inside a for loop
并将数组映射到这样的向量并清除它
std::vector<uint8_t> fckn_vector(InputArray, InputArray + ArrayElementCount);
fckn_vector.clear();
我 100% 确定一定有一种非常简单的方法可以做到这一点,但是我不擅长 C++。
【问题讨论】:
-
我不是互操作专家,但至少我认为在非托管端删除托管对象将是一个坏的想法。
-
另外,您可能想要固定您的阵列。 msdn.microsoft.com/en-us/library/f58wzh21.aspx
-
向我们展示您在 C# 端的
DataProcesor方法的定义。 -
@Luaan 添加了定义
-
好的,在这种情况下,你绝对不应该删除数组——它是由编组器处理的。为什么你认为有内存泄漏?你还在 C++ 代码中做什么?您是否同时运行多个
DataProcessors?由于数组是 blittable,它应该被固定而不是复制 - 你可能有堆碎片问题吗?尝试使用 CLRProfiler 监控内存布局。