正如有些人可能知道的那样,我最近在我的网站上发布了关于高内存使用的文章,我认为我的缩略图可能与此有关,因为我没有积极地处理由于我误解了它的工作原理而使用的示例。
我现在正在看我的缩略图程序的代码,想知道什么时候需要处理一些东西,只有当你创建一个对象的新示例时才需要处理吗?
比如:
Target := System.Drawing.Bitmap.Create(Trunc(Width), Trunc(Height));
MyImage := Target.FromFile(PhotoPath);
所以,我的问题是,我是否需要处理Target和MyImage以确保GC正确地完成它需要做的事情?
谢谢.
5条答案
按热度按时间r1wp621o1#
看看这篇在MSDN上的博客文章:.NET Memory Leak: To dispose or not to dispose, that’s the 1 GB question .建议是你应该处理掉。
zfciruhq2#
作为一项一般政策,我想把这个问题反过来说:
我有什么理由不把这些东西处理掉呢
如果类实现了
IDisposable
,那么您的工作就是处理它。在许多情况下,虽然对象在你释放它时并没有做太多的事情,但这并不意味着你不应该对它调用Dispose。如果你升级到一个新的.NET运行时版本,这可能已经改变了。
好吧,让我澄清一下我在这里说的话。
当然,我并不是说你应该在任何实现
IDisposable
的对象上调用Dispose
。问题是,“这是你的目标吗?”如果你建造了它,这是你的责任。如果有人给了你一件物品,就假设它不是你的,除非你特别要求别人给你一件物品,而不仅仅是暂时借给你。
当然也有其他的例外,但是 * 作为一般规则 *,你拥有的实现
IDisposable
的对象,当你完成的时候就把它们处理掉。zmeyuzjn3#
Image
实现了一次性。你用完后应该处理掉。对于图像来说,处理它们非常重要。它们只分配几个字节的托管内存,但引用一大块本机内存。ryevplcw4#
是的,这两个调用都会导致创建新的
Bitmap
对象,因此在处理完它们之后需要释放它们。您还应该知道,您可能正在使用的其他图形相关对象也需要被处理,如
Graphics
,Brush
和Font
。utugiqy65#
是,丢弃您创建的IDisposables。在GDI+中
最好在
using() {}
块中。