1

考虑以下代码片段并忽略缺少using子句或显式处置:


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

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

4

2 回答 2

5

什么时候image被释放,这将释放流 -Image.FromStream有效地获得它给定的流的所有权。

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

于 2011-08-23T11:59:39.997 回答
2

除了乔恩的回答 - 将方法更改为非静态将无效。您在静态方法中有一个 Image 局部变量这一事实不会改变任何事情 - 它只是堆栈上对堆上对象的引用。当方法退出时,引用从堆栈中删除。因此,无论该方法是否是静态的,都不会改变内存泄漏。

这里内存泄漏的可能性是,如果图像从未被处理过,也从未被垃圾收集过。

于 2011-08-24T09:02:33.377 回答