2010-09-27 7 views
1

J'appelle un morceau d'un code C++ non géré de mon application C# pour calculer la transformée de Fourier rapide d'un signal temporel discret.Libération de code non géré en C#

Je fais quelque chose d'appel comme celui-ci

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

     } 

Bien que ce bout de code fonctionne très bien et me donne les résultats escomptés, je peux voir qu'il y est une sorte de coup de performance (fuite de mémoire) est engagée alors que le calcul est en cours. Le CLR ne parvient pas à récupérer les variables locales (doubles) et mon application engloutit considérablement l'espace RAM. Est-ce que quelqu'un d'entre vous peut suggérer les endroits où je pourrais me tromper.? De mon côté, j'ai couru mon application utilisant ANTS Mem Profiler et je peux voir sur l'instantané que les objets doubles réclament presque> 150MB de l'espace de mem. Est-ce un comportement normal ??

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

Toute aide est appréciée à cet égard Srivatsa

Répondre

0

Vous pouvez utiliser la méthode Marshal.Copy (IntPtr, Double [], Int32, Int32) pour copier un tableau de valeurs doubles de ptr non géré vers un tableau ffData géré. Si ComputeFFTW renvoie un pointeur vers la mémoire allouée dynamiquement, vous devez le libérer après l'utilisation. Faites cela en code non managé, ajoutez une fonction comme Release et passez ptr à cela.

+0

Merci Alex.Ceci m'a aidé à résoudre un peu. Je pense que je devrai déboguer du côté C++ pour vérifier ce qui se passe de ce côté du code. –

4

Puisque la fonction C++ alloue la mémoire nécessaire, vous devrez ce morceau dans votre application C# libre manuellement (libérer le pointeur). Une meilleure façon d'invoquer du code non géré est d'allouer toutes les variables et tous les morceaux de mémoire (paramètres Temp aussi) dans votre application C# et de les passer à votre code C++ en tant que paramètres. De cette façon, vous n'aurez pas de problèmes de mémoire avec votre code non géré.

Questions connexes