Создается ли утечка памяти, если MemoryStream в .NET не закрыта? - PullRequest
103 голосов
/ 24 октября 2008

У меня есть следующий код:

MemoryStream foo(){
    MemoryStream ms = new MemoryStream();
    // write stuff to ms
    return ms;
}

void bar(){
    MemoryStream ms2 = foo();
    // do stuff with ms2
    return;
}

Есть ли вероятность, что MemoryStream, который я выделил, каким-то образом не удастся утилизировать позже?

Я получил экспертную оценку, настаивающую, чтобы я закрыл это вручную, и я не могу найти информацию, чтобы сказать, имеет ли он действительную точку или нет.

Ответы [ 12 ]

0 голосов
/ 15 мая 2009

Утилизация неуправляемых ресурсов недетерминирована в языках с мусором. Даже если вы вызываете Dispose явно, вы абсолютно не можете контролировать, когда память на самом деле освобождается. Dispose неявно вызывается, когда объект выходит из области видимости, выходя из оператора using или вызывая стек вызовов из подчиненного метода. Все это, как говорится, иногда объект может фактически быть оберткой для управляемого ресурса (например, файла). Вот почему рекомендуется явно закрывать операторы finally или использовать оператор using. Приветствия

0 голосов
/ 24 октября 2008

Я не эксперт по .net, но, возможно, проблема здесь в ресурсах, а именно в дескрипторе файла, а не в памяти. Я предполагаю, что сборщик мусора в конечном итоге освободит поток и закроет дескриптор, но я думаю, что всегда было бы лучше закрыть его явно, чтобы убедиться, что вы выгрузили содержимое на диск.

...