2012-11-08 146 views
2

我與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調用成功?

+0

拆分該行分爲兩個文件,看看它是'Marshall.Copy'拋出異常或'File.ReadAllBytes'說都這樣做。我敢打賭後者。 – MusiGenesis

+0

這不就是說你沒有2次〜800MB的內存嗎? – Jasper

回答

6

原因還具有讀這會導致額外的〜800 MB

+1

當然......你是對的。 –

+0

我試過了,所以我需要10分鐘的等待時間。 –

+1

+1。可能感興趣 - http://stackoverflow.com/questions/4742016/using-vs2010-profiler-for-memory-measurement。我還建議在該塊周圍添加一些try/catch語句,並且可以考慮在將像這樣的大對象加載到內存時使用'using'語句,以便它將始終處理http://msdn.microsoft.com/ EN-US /庫/ yh598w02(v = VS.80)的.aspx –

相關問題