2015-10-03 4 views
1

Я соблюл беспилотный массива с использованием:Как Marshal.FreeHGlobal может освободить беспилотный массив?

IntPtr ptr = Marshal.AllocHGlobal(Marshal.SizeOf(array[0]) * array.Length); 

затем освободить его с помощью:

Marshal.FreeHGlobal(ptr); 

насколько я читал, это будет правильно освободить память и не собирается утечка памяти не произойдет. Мой вопрос: это правда? если это так, как это работает? является ли состояние маршала полным и хранит метаданные о всех зарезервированных данных?

+0

Одним из способов отслеживания размера выделения является префикс выделенного блока с размером, например BSTR. – PetSerAl

+0

Вы имели в виду, что это происходит в распределении и освобождении автоматически, и все идет гладко и красиво? –

+1

Я говорю, это один из нескольких способов сделать это. Я не знаю, как это реализовано. Как говорит @thefiloe, это просто оболочка вокруг функций WinAPI. Контракт заключается в том, что 'FreeHGlobal' должен правильно освобождать все, что было выделено' AllocHGlobal'. – PetSerAl

ответ

2

Метод AllocHGlobal предоставляет функцию LocalAlloc. И метод FreeHGlobal предоставляет функцию LocalFree. Управление памятью не выполняется с помощью любого управляемого компонента. Это делается с помощью кода, стоящего за этими функциями api windows.

Чтобы ответить на ваш вопрос: Да, он должен отслеживать выделенные размеры. Вы можете получить размер дескриптора, вызвав функцию LocalSize. Честно говоря, я не знаю, как это делается внутри, но вам не нужно это знать.

+0

Так что, пожалуйста, просто доводите его до моего вопроса яснее, если вы не против –

Смежные вопросы