English 中文(简体)
如果我没有的话,为什么会出现记忆泄露。 I .Save () to a MemoryStream?
原标题:Why is there a memory leak when I do not .Dispose() Bitmaps that I .Save() to a MemoryStream?

Say I造就了比图。

Bitmap bitmap = new Bitmap(320, 200);

当我写给某几流时(就我的情况而言,正如HttpListenerResponse所介绍的那样,它带上了HttpResponseStream),所有东西都是罚款的:

bitmap.Save(stream, ImageFormat.Png);

我无需绘制蓝图。 处置法,轨道图所使用的资源将自动清理。 然而,直接写给一名Png到一个无法预见的溪流的问题是,这可能导致。 在GDI+发生一个通用错误,在我审判我的Ap app 时发生这种情况。 因此,我的法律现在如何看待:

using (MemoryStream ms = new MemoryStream())
{
  bitmap.Save(ms, ImageFormat.Png);
  ms.WriteTo(stream);
}

现在,除非我勾画。 之后,将予以披露。

Rephrased question to get more specific answers: Why does this leaking of Bitmap memory seem to depend on what type of stream I save it to?

Update: As I ve been asked in comments if I m sure it s a leak. Calling the above repeatedly in a stress test, my w3wp process will go up to gigs and gigs of memory used until my machine start swapping and it will not clean up.

问题回答

比图族利用未经管理的资源。 这些资源与记忆流阶级利用的资源无关。 在你完成标本时,你只能用说明的形式总结一下。

问题后半部分由小姐主讲。 一种“制造和忘记它”的办法,是建立一个有色人种,暴露出标本,但实施一种处置标本的 des子。 这种脱轨器将意味着在垃圾收集中暗地处置了比图类。

最后说明: 您的直觉目标,即执行可归结的海关编码。 永远不会被暗指。 甚至在你的第一个例子中。 仅仅因为你将数据节省到一个流子,而不会说当时记忆被分配。 大部分时间是在瞬息万变的法典的同一部分中去除物体。 这有助于通过提高守则透明度来更容易阅读守则。

我认为,问题在于假设理事会将mag笑你的物品。 然而,它可能永远不会这样做,这里我想到的是:

对比图利用未经管理的资源来掌握比图数据,比图数据则大。 因此,你将分配一个有管理记忆的tiny栏,并为每个轨道图分配一个庞大的未经管理记忆块。

因此,你离开了你为GC收集休闲活动而绘制的比图。 这对许多物体来说是好的,因为很快,GC会收到足够的记忆压力,要求它们重新使用记忆。 广播电视理事会观看了有管理的肥皂,并说“在处置未使用物体时,我只能从记忆中恢复64个。 我赢得了双手”。 它看不到未经管理的资源的千兆字节,而只有很少的 by。

因此,你需要跟踪和处置轨道图。

也许,有些时间你认为可以清理。 这是因为,在重大情况下(例如,当你处置其他物体,如带有较大记忆印迹的溪流,或仅仅因为每天下午有线虫) 选择处理未使用的记忆区,然后最后处理你的比照图。 但是,你不能就此做rely

...... Ramble:

在老时代,点人面临两个问题。

  • They could be null, leading to crashing code
  • You could forget to free their memory/resources and get leaks

因此,在网中,他们改名为“参照”的“点人”,增加了“参考”和“,认为问题没有再存在。 除此以外,参考资料仍然无效,方案人员仍须跟踪和管理资源,以避免泄露——略微少见。 我认为,这是一件坏事——它使我们感到气愤和效率低下,而没有实际消除根本问题,那么它就回头并使我们感到迷惑,我们最后撰写了反对逻辑的回播,我们当时习惯于在我们的人身上简单删除。

You must dispose the bitmap in order to release the GDI+ resources. It is that simple. It is one of the few times calling Dispose is required. If you are caching your bitmap to reduce disk access then clone the image and use the clone to save to the stream. I strongly recommend flushing, closing, and disposing of stream. When done, set clone and stream variables to null.





相关问题
Anyone feel like passing it forward?

I m the only developer in my company, and am getting along well as an autodidact, but I know I m missing out on the education one gets from working with and having code reviewed by more senior devs. ...

NSArray s, Primitive types and Boxing Oh My!

I m pretty new to the Objective-C world and I have a long history with .net/C# so naturally I m inclined to use my C# wits. Now here s the question: I feel really inclined to create some type of ...

C# Marshal / Pinvoke CBitmap?

I cannot figure out how to marshal a C++ CBitmap to a C# Bitmap or Image class. My import looks like this: [DllImport(@"test.dll", CharSet = CharSet.Unicode)] public static extern IntPtr ...

How to Use Ghostscript DLL to convert PDF to PDF/A

How to user GhostScript DLL to convert PDF to PDF/A. I know I kind of have to call the exported function of gsdll32.dll whose name is gsapi_init_with_args, but how do i pass the right arguments? BTW, ...

Linqy no matchy

Maybe it s something I m doing wrong. I m just learning Linq because I m bored. And so far so good. I made a little program and it basically just outputs all matches (foreach) into a label control. ...