/// <summary> /// Resizes the memory block previously allocated by Allocate(). /// </summary> /// <param name="pv">The pointer to the block to resize.</param> /// <param name="newSize">The new size of the block.</param> /// <returns>The pointer to the resized block.</returns> public static IntPtr ReAlloc(IntPtr pv, long newSize) { if (hHeap == IntPtr.Zero) { InitializeHeap(); } IntPtr block; long oldSize = Size(pv); try { UIntPtr bytes = new UIntPtr((ulong)newSize); block = SafeNativeMethods.HeapReAlloc(hHeap, 0U, pv, bytes); } catch (OverflowException ex) { throw new OutOfMemoryException(string.Format(CultureInfo.InvariantCulture, "Overflow while trying to allocate {0:N} bytes", newSize), ex); } if (block == IntPtr.Zero) { throw new OutOfMemoryException(string.Format(CultureInfo.InvariantCulture, "HeapAlloc returned a null pointer while trying to allocate {0:N} bytes", newSize)); } if (oldSize > 0L) { MemoryPressureManager.RemoveMemoryPressure(oldSize); } if (newSize > 0) { MemoryPressureManager.AddMemoryPressure(newSize); } return(block); }
/// <summary> /// Resizes the memory block previously allocated by Allocate(). /// </summary> /// <param name="pv">The pointer to the block to resize.</param> /// <param name="newSize">The new size of the block.</param> /// <returns>The pointer to the resized block.</returns> public static IntPtr ReAlloc(IntPtr pv, int newSize) { if (hHeap == IntPtr.Zero) { InitializeHeap(); } IntPtr block; long oldSize = Size(pv); try { UIntPtr bytes = new UIntPtr((ulong)newSize); block = SafeNativeMethods.HeapReAlloc(hHeap, 0U, pv, bytes); } catch (OverflowException) { throw new OutOfMemoryException(); } if (block == IntPtr.Zero) { throw new OutOfMemoryException(); } if (oldSize > 0L) { MemoryPressureManager.RemoveMemoryPressure(oldSize); } if (newSize > 0) { MemoryPressureManager.AddMemoryPressure(newSize); } return(block); }