/// <summary> /// Frees a block of memory previously allocated with Allocate(). /// </summary> /// <param name="block">The block to free.</param> /// <exception cref="InvalidOperationException">There was an error freeing the block.</exception> public static void Free(IntPtr block) { if (Memory.hHeap != IntPtr.Zero) { long bytes = (long)SafeNativeMethods.HeapSize(hHeap, 0, block); bool result = SafeNativeMethods.HeapFree(hHeap, 0, block); if (!result) { int error = Marshal.GetLastWin32Error(); throw new InvalidOperationException("HeapFree returned an error: " + error.ToString(CultureInfo.InvariantCulture)); } if (bytes > 0) { MemoryPressureManager.RemoveMemoryPressure(bytes); } } else { #if REPORTLEAKS throw new InvalidOperationException("memory leak! check the debug output for more info, and http://blogs.msdn.com/ricom/archive/2004/12/10/279612.aspx to track it down"); #endif } }