c# – 为什么我没有内存泄漏.Dispose()我将.Save()的位图映射到M
假设我创建了一个位图
Bitmap bitmap = new Bitmap(320,200); 当我把它写到某个流(在我的情况下,它是一个HttpResponseStream,由HttpListenerResponse给出),一切都很好: bitmap.Save(stream,ImageFormat.Png); 我不需要bitmap.Dispose(),位图使用的资源将自动清理.直接将Png写入不可搜索的流的问题是它可能导致A generic error occurred in GDI+,当我在Azure上尝试我的Asp应用程序时发生这种情况.这就是我的代码现在的样子: using (MemoryStream ms = new MemoryStream()) { bitmap.Save(ms,ImageFormat.Png); ms.WriteTo(stream); } 现在除非我之后使用bitmap.Dispose(),否则会泄漏. 重新提出问题以获得更具体的答案: 更新: 解决方法
Bitmap类使用非托管资源.这些资源与内存流类使用的资源无关.您可以将位图类包装在using语句中,以便在完成后处理位图实例.
错过了你问题的后半部分. “设置并忘记它”的一种方法是创建一个包装类,它暴露位图实例,但实现了一个处理位图实例的析构函数.这个析构函数意味着位图类在垃圾收集中被隐式处理. 最后要注意:您实例化实现IDisposable的任何对象必须由您的代码处理. Dipose永远不会被暗中调用.即使在你的第一个例子.仅仅因为您将数据保存到流中并不意味着内存已被释放.大多数情况下,在实例化它的同一代码段中对一个对象进行dipos是个好主意.这有助于通过提高代码透明度来更轻松地阅读代码. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |