c# - 释放 C# 中的非托管代码

标签 c# .net unmanaged

我从我的 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/

相关文章:

c# - 如何显示 StringLabelValue?

c# - 在 C# 中的 File 类上使用静态方法是否安全?

c# - ASP.NET MVC View 内部 View

c# - 在 NUnit 测试中卸载外部非托管 dll

C++托管到非托管的转换

c# - 清除图形对象为黑色或其他 RGB

c# - 获取当前 GMT 时间

.net - 使用 NHibernate 映射字符串集合

.net - 流利的 NHibernate : multiple one-to-many relationships between the same entities

c# - 从托管 DLL 调用时非托管 Dll 中出现 StackOverflow 异常