私はXY問題があります。私は現在、Y自体で何が起こっているのかを学び、理解しようとしています。私のシナリオを再現するには、このコード(およびSystem.Webの4.0参照)で新しいコンソールアプリケーションを作成します。もう一度SessionStateItemCollectionで予期しないOutOfMemoryExceptionがデシリアライズ
var badData = new byte[] { 66, 97, 100, 32, 68, 97, 116, 97 };
using (var ms = new MemoryStream(badData))
using (var br = new BinaryReader(ms))
{
var item = SessionStateItemCollection.Deserialize(br); // <-- OOMException here
}
Console.ReadKey();
、私はこのコードであらゆる種類の問題があり、実現が、私は行く前にXに戻って実際の問題を修正し始めたら、を理解してを理解して、なぜOutOfMemoryException
になるのかを知りたいです。
私は自分の疑問に答えようとしましたが、最初は常識的でしたが、このコードが多くのメモリを消費する理由はないと思いますか?
public ArrayList(int capacity) {
if (capacity < 0) throw new ArgumentOutOfRangeException("capacity", Environment.GetResourceString("ArgumentOutOfRange_MustBeNonNegNum", "capacity"));
Contract.EndContractBlock();
if (capacity == 0)
_items = emptyArray;
else
_items = new Object[capacity];
}
:
mscorlib.dll!System.Collections.ArrayList.ArrayList(int capacity) + 0x1f bytes
System.dll!System.Collections.Specialized.NameObjectCollectionBase.Reset(int capacity) + 0x21 bytes
System.Web.dll!System.Web.SessionState.SessionStateItemCollection.Deserialize(System.IO.BinaryReader reader) + 0x75 bytes
ConsoleApplication1.exe!ConsoleApplication1.Program.Main(string[] args) Line 20 + 0x9 bytes C#
は、だから私はこのコードで the source ofSystem.Collections.ArrayList
's relevant constructorをチェックアウト:私は、コールスタックを見て、私の質問に答えることを試みたので、次の、
それはではないは
OutOfMemoryException
を投げる。それにもかかわらず(そのコールスタックで)その例外が発生するのはなぜですか?