C# 非托管内存流处理和内存泄漏

C# 非托管内存流处理和内存泄漏,c#,garbage-collection,dispose,unmanagedresources,C#,Garbage Collection,Dispose,Unmanagedresources,考虑以下代码片段,忽略缺少using子句或显式处理: public static Image GetImage(string imageName) { Image image = null; Stream unmanagedMemoryStream = Assembly.GetExecutingAssembly().GetManifestResourceStream(imageName); image = Image.FromSt

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


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

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

当处置
映像时,将处置流-
映像。FromStream
有效地拥有给定流的所有权


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

当处理
图像
时,这将处理流-
图像。FromStream
有效地获得其给定流的所有权


特别是,如果您在此处使用
语句在
中处理流,则至少对于某些图像类型,图像将不可用。

除了Jon的答案之外,将方法更改为非静态将没有任何效果。在静态方法中有一个Image局部变量这一事实不会改变任何事情——它只是堆栈上对堆上对象的引用。当方法退出时,引用将从堆栈中移除。因此,无论该方法是静态的还是非静态的,都不会改变内存泄漏的情况


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

除了Jon的答案之外,将方法更改为非静态将没有任何效果。在静态方法中有一个Image局部变量这一事实不会改变任何事情——它只是堆栈上对堆上对象的引用。当方法退出时,引用将从堆栈中移除。因此,无论该方法是静态的还是非静态的,都不会改变内存泄漏的情况


内存泄漏的可能性在于图像从未被处理,也从未被垃圾收集。

标记为答案是因为尽管Jon先到了那里,但你回答了我所有的问题,而不仅仅是第一个问题。标记为答案是因为尽管Jon先到了那里,你回答了我所有的问题,而不仅仅是第一个问题。