Quelqu'un peut-il expliquer ce qui se passe exactement à un niveau bas/perspective de gestion de la mémoire sur les lignes 2 C# dans "Main" dans ce qui suit?C# appelant la méthode C++ qui renvoie un pointeur. Expliquer la gestion de la mémoire
C++ code (non géré):
#define DLLEXPORT extern "C" __declspec(dllexport)
DLLEXPORT MyClass* MyClass_MyClass()
{
return new MyClass();
}
DLLEXPORT void MyClass_setName(MyClass* myClass, const char* name)
{
myClass->setName(name);
}
MyClass::MyClass()
{
_name.clear();
}
void MyClass::setName(const char* name)
{
_name.setCString(name, NAME_MAX_BYTES);
}
C# Code:
[DllImport(@"lib.dll")]
private static extern IntPtr MyClass_MyClass();
[DllImport(@"lib.dll")]
public static extern void MyClass_setName(
IntPtr myClass,
[System.Runtime.InteropServices.InAttribute()]
[System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.LPStr)]
string name);
public static void Main(string[] args)
{
var myClass = MyClass_MyClass();
MyClass_setName(myClass , "Test Name");
}
Plus précisément, je me demande comment .NET ne sait beaucoup d'espace à allouer à "myClass"? Il doit faire une sorte de "Marshal.AllocHGlobal (SIZE)" en arrière-plan, non? Que se passe-t-il si plus d'espace est nécessaire (je donne un nom?)? De plus, y a-t-il un risque que la collecte des ordures se déplace et déplace la mémoire et gâche mon «IntPtr myClass»?