UnmanagedMemoryStream处理和内存泄漏

时间:2011-08-23 11:54:24

标签: c# garbage-collection dispose unmanagedresources

考虑以下代码段并忽略使用子句或明确处置的缺失:


    public static Image GetImage(string imageName)
    {
        Image image = null;
        Stream unmanagedMemoryStream = Assembly.GetExecutingAssembly().GetManifestResourceStream(imageName);
        image = Image.FromStream(unmanagedMemoryStream);
        return image;
    }

何时在 unmanagedMemoryStream 上调用Dispose()?如果包含方法是非静态的,这将如何改变?在这种情况下是否可能泄漏非托管内存?

2 个答案:

答案 0 :(得分:5)

当处置image时,将处理流 - Image.FromStream有效地获取其给定的流的所有权。

特别是,如果您 在此处using语句中处理了流,则该图像将无法使用,至少对于某些图像类型而言。

答案 1 :(得分:2)

除了Jon的答案 - 将方法更改为非静态将无效。在静态方法中有一个Image局部变量的事实不会改变任何东西 - 它只是堆栈上对堆上对象的引用。方法退出时,将从堆栈中删除引用。因此,该方法是否是静态的,在内存泄漏方面没有任何改变。

此处内存泄漏的可能性是,图像永远不会被处置,也不会被垃圾收集。