У меня есть этот C++ код:Нужно ли удалять структуры, маршалированные через Marshal.PtrToStructure в неуправляемом коде?
extern "C" __declspec(dllexport) VOID AllocateFoo(MY_DATA_STRUCTURE** foo)
{
*foo = new MY_DATA_STRUCTURE;
//do stuff to foo
}
Затем в C# я вызвать функцию таким образом:
[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;
}
Где MyDataStructure является структурой (не класс), который соответствует MY_DATA_STRUCTURE и члены ранжированы соответственно.
Так что вопросы: мне нужно сохранить pData, а затем снова освободить его в неуправляемом коде, когда MyDataStructure GC'd? MSDN говорит для Marshal.PtrToStructure (IntPtr, Type): «Данные маршалов из неуправляемого блока памяти в новый выделенный управляемый объект указанного типа». В этом предложении «Маршалл» означает «копия»? В каком случае мне нужно будет сохранить (IntPtr pData), а затем передать его неуправляемому коду (в деструкторе MyDataStructure), чтобы я мог выполнить «удаление» на C++?
Я искал, но я не могу найти достаточно явный ответ для этого.
Ваша неуправляемая функция AllocateFoo не работает так, как написано. Вам нужен дополнительный уровень косвенности, чтобы вернуть указатель обратно вызывающему. i.e., AllocateFoo (MY_DATA_STRUCTURE * * foo) { * foo = new MY_DATA_STRUCTURE; } – GBegen
Да, вы правы! В моем фактическом коде используется PMY_DATA_STRUCTURE *, я отредактирую сообщение. – Serguei