I tienen este código C++:¿Debo eliminar estructuras ordenadas mediante Marshal.PtrToStructure en código no administrado?
extern "C" __declspec(dllexport) VOID AllocateFoo(MY_DATA_STRUCTURE** foo)
{
*foo = new MY_DATA_STRUCTURE;
//do stuff to foo
}
Luego, en C# I llamar a la función así:
[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;
}
Dónde MyDataStructure es una estructura (no clase) que corresponde a MY_DATA_STRUCTURE y los miembros se marshalled apropiadamente.
Preguntas: ¿necesito almacenar pData y luego liberarlo de nuevo en código no administrado cuando MyDataStructure es GC'd? MSDN dice para Marshal.PtrToStructure (IntPtr, Type): "Marshals datos de un bloque de memoria no administrado a un objeto gestionado recientemente asignado del tipo especificado." En esa oración ¿"Marshall" significa "copia"? ¿En ese caso necesitaría preservar (IntPtr pData) y luego pasarlo a un código no administrado (en el destructor MyDataStructure) para poder hacer una "eliminación" de C++?
He buscado pero no encuentro una respuesta suficientemente explícita para esto.
Su función no administrada, AllocateFoo, no funciona como está escrita. Necesita un nivel adicional de indirección para devolver el puntero a la persona que llama. es decir, AllocateFoo (MY_DATA_STRUCTURE * * foo) { * foo = new MY_DATA_STRUCTURE; } – GBegen
¡Sí, tienes razón! Mi código real usa PMY_DATA_STRUCTURE *, editaré la publicación. – Serguei