2010-12-10 4 views
3

Il existe 2 binaires. L'un est natif/non géré C++ dll et l'autre est géré C# exe. Maintenant, ce que je fais est d'écrire une fonction dans C++ dll et de la mémoire allouée à l'intérieur en utilisant malloc. J'ai exporté cette fonction pour être utilisée par mon module C#.Est-il nécessaire de libérer de la mémoire dans le code non managé lorsqu'il est chargé par le code managé

En C++ je l'ai fait:

char* FunctionHavingAllocatedMemory(int i){ 

char* p = (char*)malloc(100); 

..... 

//use p and do not free it. 

return p; 

} 

En C# Je l'ai fait:

[DllImport("C++.dll")] 

private static extern string FunctionHavingAllocatedMemory(int i); 

Maintenant, ma question est: Y at-il besoin de libérer de la mémoire en C++ module ou C# module libre arbitre automatiquement quand la fonction reviendra. Pourquoi je pense que C# est un module géré, il nettoiera automatiquement la mémoire.

(Bien qu'il soit bon de libérer de la mémoire en C++ mais j'ai certaines contraintes que je ne peux pas libérer de mémoire en C++. Je voulais juste en savoir plus sur les applications managées et la gestion de la mémoire).

Répondre

2

Le garbage collector ne fonctionne que sur le tas géré : la mémoire allouée dans FunctionHavingAllocatedMemory est de votre responsabilité à libérer.

0

GC sera responsable de la gestion de la mémoire pour le code managé pour le code non géré, vous devez vous soucier de la façon de récupérer la mémoire. Je pense que vous pouvez définir une fonction dans la classe C++ qui libèrera la mémoire en interne.

2

Vous pouvez également affecter la mémoire non managée en C# en utilisant Marshal.AllocHGlobal(), lui transmettre un pointeur vers votre DLL native et Marshal.FreeHGlobal() en C#. La classe Marshal dispose également de certaines fonctions permettant de copier des données dans la mémoire allouée ou d'en extraire des données.

Questions connexes