我从我的 C# 应用程序中调用一段非托管 C++ 代码 计算离散时间信号的快速傅立叶变换。
我打电话是这样的
IntPtr ptr = ComputeFFTW(packetSig, packetSig.Length, (int)samplFrequency,(int)fftPoints);
unsafe
{
double *dPtr = (double*)ptr;
for(int l = 0; l < fftData.Length; l++)
{
fftData[l] = dPtr[l];
}
}
虽然这段代码工作正常并给出了我想要的结果,但我可以看到在计算过程中会产生某种性能影响(内存泄漏)。 CLR 无法回收局部(双)变量,我的应用程序大量占用了 RAM 空间。
你们中的任何人都可以建议我可能做错的地方吗。
在我这边,我使用 ANTS Mem Profiler 运行我的应用程序,我可以在快照上看到双对象几乎占据了 >150MB 的内存空间。这是正常行为吗??
Class Name Live Size (bytes) Live Instances
Double[] 150,994,980 3
在这方面的任何帮助表示赞赏 斯里瓦察
最佳答案
由于 C++ 函数分配内存,因此您必须在 C# 应用程序中手动释放该 block (释放指针)。调用非托管代码的更好方法是在 C# 应用程序中分配所有变量和内存块(还有 Temp 参数),并将它们作为参数传递给 C++ 代码。这样,您的非托管代码就不会出现任何内存问题。
关于c# - 释放 C# 中的非托管代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3802251/