Есть ли утечка unmanaged памяти?
От: adontz Грузия http://adontz.wordpress.com/
Дата: 24.09.10 23:28
Оценка:
Есть структура с полем — указателем на строку

[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);
}

?
A journey of a thousand miles must begin with a single step © Lau Tsu
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.