public override unsafe void *Reallocate(void *pointer, int elementCount, int elementSize = 1, bool initMemory = true)
        {
            if (pointer == null)
            {
                throw new ArgumentException("Invalid pointer");
            }

            if (elementCount <= 0)
            {
                throw new ArgumentException(elementCount.ToString(), nameof(elementCount));
            }

            if (elementSize <= 0)
            {
                throw new ArgumentException(elementSize.ToString(), nameof(elementSize));
            }

            LocalMemoryFlags flags      = initMemory ? LocalMemoryFlags.LMEM_MOVEABLE | LocalMemoryFlags.LMEM_ZEROINIT : LocalMemoryFlags.LMEM_MOVEABLE;
            void *           newPointer = Kernel32LocalMemory.LocalReAlloc(pointer, (uint)(elementCount * elementSize), flags);

            if (newPointer == null)
            {
                Console.WriteLine(Marshal.GetLastWin32Error());
                throw new OutOfMemoryException();
            }

            return(newPointer);
        }
 public override unsafe void Free(void *pointer)
 {
     if (Kernel32LocalMemory.LocalFree(pointer) != null)
     {
         throw new ArgumentException("Invalid pointer");
     }
 }
        public int SizeOf(void *pointer)
        {
            if (pointer == null)
            {
                throw new ArgumentException("Invalid pointer");
            }

            return((int)Kernel32LocalMemory.LocalSize(pointer));
        }
        public override unsafe void *Allocate(int elementCount, int elementSize = 1, bool initMemory = true)
        {
            if (elementCount <= 0)
            {
                throw new ArgumentException(elementCount.ToString(), nameof(elementCount));
            }

            if (elementSize <= 0)
            {
                throw new ArgumentException(elementSize.ToString(), nameof(elementSize));
            }

            LocalMemoryFlags flags   = initMemory? LocalMemoryFlags.LPTR: LocalMemoryFlags.LMEM_FIXED;
            void *           pointer = Kernel32LocalMemory.LocalAlloc(flags, (uint)(elementCount * elementSize));

            if (pointer == null)
            {
                throw new OutOfMemoryException();
            }

            return(pointer);
        }