Удаление UnmanagedMemoryStream и утечки памяти - PullRequest
1 голос
/ 23 августа 2011

Учитывая следующий фрагмент кода и игнорируя отсутствие , используя предложение или явное удаление:


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

Когда Dispose () будет вызываться для unmanagedMemoryStream ? Как это изменится, если содержащий метод будет сделан нестатичным? Возможна ли утечка неуправляемой памяти в этой ситуации?

Ответы [ 2 ]

5 голосов
/ 23 августа 2011

Когда удаляется image, это будет распоряжаться потоком - Image.FromStream фактически берет на себя ответственность за данный поток.

В частности, если вы сделали распоряжаться потокомздесь в выражении using изображение будет непригодным для использования, по крайней мере, для некоторых типов изображений.

2 голосов
/ 24 августа 2011

В дополнение к ответу Джона - изменение метода на нестатический не будет иметь никакого эффекта.Тот факт, что у вас есть локальная переменная Image в статическом методе, ничего не меняет - это просто ссылка в стеке на объект в куче.Когда метод завершается, ссылка удаляется из стека.Поэтому, является ли метод статическим или нет, ничего не меняет с точки зрения утечки памяти.

Здесь возможна утечка памяти, если изображение никогда не удаляется и никогда не удаляется мусором.

...