2011-08-23 102 views
1

考虑下面的代码片段,可俯瞰使用条款或明确的处置缺乏的:UnmanagedMemoryStream处理和内存泄漏


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

当将Dispose()方法上unmanagedMemoryStream叫?如果包含方法变为非静态,这将如何改变?在这种情况下,可能存在未被管理的内存泄漏吗?

回答

2

除了乔恩的答案 - 将方法更改为非静态将不起作用。你在静态方法中拥有一个Image局部变量的事实不会改变任何东西 - 它只是栈上的一个对象的引用。当方法退出时,引用将从堆栈中移除。因此,无论是否为静态,都不会改变内存泄漏。

这里的内存泄漏的可能性是如果图像永远不会丢弃,也不会收集垃圾。

+0

标记为答案,因为虽然乔恩先到那里,但您回答了我的所有问题,而不仅仅是第一个问题。 – nukefusion

5

image被处置时,将处置流 - Image.FromStream有效地获得它给出的流的所有权。

特别是,如果你没有一个using声明处分流在这里,图像将是不可用的,至少对某些图像类型。