释放 C# 中的非托管代码

发布于 2024-09-25 05:08:04 字数 720 浏览 2 评论 0原文

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

在这方面的任何帮助表示赞赏 斯里瓦察

I call a piece of an unmanaged C++ code from my C# application
to calculate fast fourier transform of a discrete time signal.

I make a call something like this

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];
            }   

      }

Though this snippet of code works fine and gives me the desired results, i can see that there is sort of performance hit (memory leak) is incurred while calculation is in progress. The CLR fails to reclaim the local (double) variables and my application gobbles up RAM space considerably.

Can anyone of you suggest the places where i might be doing it wrong.

From my side, I ran my application using ANTS Mem Profiler and i can see on the snapshot that the double objects nearly claim >150MB of the mem space. Is this a normal behaviour ??

Class Name  Live Size (bytes)   Live Instances
Double[]    150,994,980         3

Any help is appreciated in this regard
Srivatsa

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

俏︾媚 2024-10-02 05:08:04

由于 C++ 函数分配内存,因此您必须在 C# 应用程序中手动释放该块(释放指针)。调用非托管代码的更好方法是在 C# 应用程序中分配所有变量和内存块(还有临时参数),并将它们作为参数传递给 C++ 代码。这样,您的非托管代码就不会出现任何内存问题。

Since the C++ function allocates memory you will have to manually free that chunk in your C# application (free the pointer). A better way to do invoke unmanaged code is to allocate all the variables and memory chunks (Temp parameters too) in your C# application and pass them to your C++ code as parameters. In this way you wont have any memory issues with your unmanaged code.

拿命拼未来 2024-10-02 05:08:04

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

IntPtr ptr = ComputeFFTW(packetSig, packetSig.Length, (int)samplFrequency,(int)fftPoints); 
 
Marshal.Copy(ptr, fftData, 0, fftData.Length);

如果 ComputeFFTW 返回指针动态分配的内存,使用后需要释放。在非托管代码中进行此操作,添加像 Release 这样的函数并将 ptr 传递给它。

You can use Marshal.Copy(IntPtr, Double[], Int32, Int32) method to copy array of double values from unmanaged ptr to managed ffData array:

IntPtr ptr = ComputeFFTW(packetSig, packetSig.Length, (int)samplFrequency,(int)fftPoints); 
 
Marshal.Copy(ptr, fftData, 0, fftData.Length);

If ComputeFFTW returns pointer to dynamically allocated memory, you need to release it after using. Make this in unmanaged code, add function like Release and pass ptr to it.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文