Есть структура с полем — указателем на строку
[StructLayout(LayoutKind.Sequential)]
internal struct StringStruct
{
[MarshalAs(UnmanagedType.LPWStr)]
public string Text;
}
Нужно передать массив таких структур в unmanaged код. Делается это примерно так
int elementSize = Marshal.SizeOf(typeof(StringStruct));
IntPtr pointer = Marshal.AllocHGlobal(elementSize * this._elements.Length);
for (int index = 0; index < this._elements.Length; index++)
{
Marshal.StructureToPtr(
new StringStruct()
{
Text = this._elements[index]
},
new IntPtr(pointer.ToInt64() + elementSize * index),
false);
}
Очевидно что под поля Text выделяются отдельные блоки памяти, так как в unmanaged представлении Text это просто структура.
Насколькоя понимаю, исполнив
Marshal.FreeHGlobal(pointer)
я эти блоки памяти не освобожу.
Что происходит на самом деле и как правильно освободить память? Может быть стооить исполнить
for (int index = 0; index < this._elements.Length; index++)
{
Marshal.StructureToPtr(
new StringStruct()
{
Text = null
},
new IntPtr(pointer.ToInt64() + elementSize * index),
true);
}
?