2010-09-27 79 views
1

我从C#应用程序 中调用一段非托管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 

任何帮助,在这方面 Srivatsa

回答

0

您可以使用Marshal.Copy方法(IntPtr,Double [],Int32,Int32)将双值数组从非托管ptr复制到托管ffData数组。

 
IntPtr ptr = ComputeFFTW(packetSig, packetSig.Length, (int)samplFrequency,(int)fftPoints); 

Marshal.Copy(ptr, fftData, 0, fftData.Length); 

如果ComputeFFTW返回指向动态分配内存的指针,则需要在使用后释放它。在非托管代码中添加此功能,添加Release等功能并将ptr传递给它。

+0

谢谢Alex.This帮我修复了一下。我想我将不得不在C++端进行调试,以检查代码的这一边是怎么回事。 – 2010-09-27 09:40:37

4

由于C++函数赞赏分配内存,你将不得不在你的C#应用​​程序手动无该块(释放指针)。调用非托管代码的更好方法是在C#应用程序中分配所有变量和内存块(Temp参数),并将它们作为参数传递给C++代码。通过这种方式,你不会有任何与非托管代码有关的内存问题。