2010-09-27 142 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++代碼。通過這種方式,你不會有任何與非託管代碼有關的內存問題。