Как Marshal.FreeHGlobal освобождает выделенную память? - PullRequest
0 голосов
/ 09 июля 2019

Я изучаю различные способы выделения и освобождения памяти в C #. Вот пример кода, который работает.

   class clsA
   {
       private IntPtr _buffer;
       public clsA()
       {
            _buffer = Marshal.AllocHGlobal(1024);
            //_buffer = Marshal.AllocCoTaskMem(1024);
       }
       public void free()
       {
           Marshal.FreeHGlobal(_buffer);
          //Marshal.FreeCoTaskMem(_buffer);
       }    
    }


   class Program
   {


      static void Main(string[] args)
      {

       unsafe
       {
            List<clsA> l = new List<clsA>();
            for(int i = 0; i < 8192; i++)
            {
                l.Add(new clsA());


            }
            Console.WriteLine("Added");
            foreach (var a in l)
            {
                a.free();
            }

            Console.ReadLine();
        }


       }
   }

Распределение памяти работает, как и ожидалось, но после перераспределения 1-2 МБ увеличивается после завершения обоих процессов. Изначально приложение имело 4,6 Мб. после размещения он достиг 13,3 Мб, что и ожидалось. Но после освобождения этого места приложение в целом использовало 7,1 Мб. Что именно здесь происходит? И как я могу освободить это оставшееся место.

...