考虑以下代码段并忽略使用子句或明确处置的缺失:
public static Image GetImage(string imageName)
{
Image image = null;
Stream unmanagedMemoryStream = Assembly.GetExecutingAssembly().GetManifestResourceStream(imageName);
image = Image.FromStream(unmanagedMemoryStream);
return image;
}
何时在 unmanagedMemoryStream 上调用Dispose()?如果包含方法是非静态的,这将如何改变?在这种情况下是否可能泄漏非托管内存?
答案 0 :(得分:5)
当处置image
时,将处理流 - Image.FromStream
有效地获取其给定的流的所有权。
特别是,如果您 在此处using
语句中处理了流,则该图像将无法使用,至少对于某些图像类型而言。
答案 1 :(得分:2)
除了Jon的答案 - 将方法更改为非静态将无效。在静态方法中有一个Image局部变量的事实不会改变任何东西 - 它只是堆栈上对堆上对象的引用。方法退出时,将从堆栈中删除引用。因此,该方法是否是静态的,在内存泄漏方面没有任何改变。
此处内存泄漏的可能性是,图像永远不会被处置,也不会被垃圾收集。