Я соблюл беспилотный массива с использованием:Как Marshal.FreeHGlobal может освободить беспилотный массив?
IntPtr ptr = Marshal.AllocHGlobal(Marshal.SizeOf(array[0]) * array.Length);
затем освободить его с помощью:
Marshal.FreeHGlobal(ptr);
насколько я читал, это будет правильно освободить память и не собирается утечка памяти не произойдет. Мой вопрос: это правда? если это так, как это работает? является ли состояние маршала полным и хранит метаданные о всех зарезервированных данных?
Одним из способов отслеживания размера выделения является префикс выделенного блока с размером, например BSTR. – PetSerAl
Вы имели в виду, что это происходит в распределении и освобождении автоматически, и все идет гладко и красиво? –
Я говорю, это один из нескольких способов сделать это. Я не знаю, как это реализовано. Как говорит @thefiloe, это просто оболочка вокруг функций WinAPI. Контракт заключается в том, что 'FreeHGlobal' должен правильно освобождать все, что было выделено' AllocHGlobal'. – PetSerAl