我與Marshal.AllocHGlobal試驗,發現令人費解的是這個代碼將不會成功,而是拋出一個OutOfMemory例外:爲什麼會拋出OutOfMemory?
namespace HAlloc
{
using System;
using System.IO;
using System.Runtime.InteropServices;
class Program
{
static void Main(string[] args)
{
// large file ~ 800MB
string fileName = @"largefile.bin";
FileInfo fileInfo = new FileInfo(fileName);
// allocation succeeds
IntPtr p = Marshal.AllocHGlobal((int)fileInfo.Length);
// OutOfMemory exception thrown here:
Marshal.Copy(File.ReadAllBytes(fileName), 0, p, (int)fileInfo.Length);
Marshal.FreeHGlobal(p);
}
}
}
爲什麼它會得到一個內存不足時AllocHGlobal調用成功?
拆分該行分爲兩個文件,看看它是'Marshall.Copy'拋出異常或'File.ReadAllBytes'說都這樣做。我敢打賭後者。 – MusiGenesis
這不就是說你沒有2次〜800MB的內存嗎? – Jasper