public static byte *Allocate(int size)
        {
            var memory =
                PlatformDetails.RunningOnPosix
                ? PosixElectricFencedMemory.Allocate(size)
                : Win32ElectricFencedMemory.Allocate(size);

#if MEM_GUARD_STACK
            Allocs.TryAdd((IntPtr)memory, Tuple.Create(size, Environment.StackTrace));
#endif
            return(memory);
        }
        public static void Free(byte *p)
        {
#if MEM_GUARD_STACK
            Tuple <int, string> _;
            if (Allocs.TryRemove((IntPtr)p, out _) == false)
            {
                var allocationsList = DoubleMemoryReleases.GetOrAdd((IntPtr)p, x => new ConcurrentSet <string>());
                allocationsList.Add(Environment.StackTrace);
            }
#endif

            if (PlatformDetails.RunningOnPosix)
            {
                PosixElectricFencedMemory.Free(p);
            }
            else
            {
                Win32ElectricFencedMemory.Free(p);
            }
        }