Ich habe dieses C++ Code:Muss ich über Marshal.PtrToStructure gemarshallte Strukturen im nicht verwalteten Code löschen?
extern "C" __declspec(dllexport) VOID AllocateFoo(MY_DATA_STRUCTURE** foo)
{
*foo = new MY_DATA_STRUCTURE;
//do stuff to foo
}
Dann in C# rufe ich die Funktion so:
[DllImport("MyDll.dll")]
static extern void AllocateFoo(out IntPtr pMyDataStruct);
...
MyDataStructure GetMyDataStructure()
{
IntPtr pData;
ManagedAllocateFooDelegate(out pData);
MyDataStructure foo = (MyDataStructure)Marshal.PtrToStructure(pData, typeof(MyDataStructure));
return foo;
}
Wo MyDataStructure eine Struktur (nicht-Klasse), die in geeigneter Weise vermarshallten MY_DATA_STRUCTURE und Mitglieder entspricht.
Also Fragen: Muss ich pData speichern und dann wieder in nicht verwalteten Code freigeben, wenn MyDataStructure GC'd ist? MSDN sagt für Marshal.PtrToStructure (IntPtr, Type): "Marshalf Daten aus einem nicht verwalteten Speicherblock zu einem neu zugeordneten verwalteten Objekt des angegebenen Typs." In diesem Satz bedeutet "Marshall" "Kopie"? In diesem Fall müsste ich (IntPtr pData) beibehalten und dann an nicht verwalteten Code übergeben (im MyDataStructure-Destruktor), damit ich C++ "delete" machen kann?
Ich habe gesucht, aber ich kann keine ausreichend explizite Antwort dafür finden.
Ihre nicht verwaltete Funktion, AllocateFoo, funktioniert nicht wie beschrieben. Sie benötigen eine zusätzliche Indirektionsstufe, um den Zeiger an den Aufrufer zurückzugeben. d. H. AllocateFoo (MY_DATA_STRUCTURE * * foo) { * foo = neu MY_DATA_STRUCTURE; } – GBegen
Ja, Sie haben Recht! Mein tatsächlicher Code verwendet PMY_DATA_STRUCTURE *, ich werde den Beitrag bearbeiten. – Serguei