Поток памяти внутри другого с помощью Memory Stream, может ли это вызвать утечку памяти?

Итак, у меня есть код, и он выглядит так,

 using (MemoryStream mStream = new MemoryStream())
     {
       MemoryStream fileStream = new MemoryStream();
     }

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

PS: Извините, если этот вопрос очевиден или глуп, я новичок в этом вопросе.

3 ответа

Решение

При использовании любого класса, который реализует IDisposable Вы должны позвонить Dispose метод, как только вы закончите с ним, чтобы позволить ему высвобождать ресурсы, которые больше не требуются вашей программе.

using Ключевое слово обрабатывает это для вас, позвонив Dispose на указанном объекте в конце блока операторов. Только указанный объект удаляется однако. Таким образом, в вашем случае mStream объект будет расположен, но fileStream объект не будет. Он останется в памяти, используя выделенное пространство памяти и т. Д., Пока сборщик мусора не очистит его.

Хотя сборщик мусора в конце концов позаботится об этом, хорошей практикой является удаление каждого объекта, который реализует IDisposable как только вы закончите с этим. using оператор помогает, но будут времена, когда вы захотите продолжать использовать объект вне области действия метода создания. Например, если вы хотите вернуть MemoryStream от метода, объект все еще должен быть расположен в некоторой точке.

Узнайте, какие классы вы используете для реализации IDisposable и привыкнуть избавляться от них. Это спасет вас от горя позже.

На самом деле распоряжаться вторым MemoryStream правильно, вам нужно вложить свой usings:

using (MemoryStream mStream = new MemoryStream())
using (MemoryStream fileStream = new MemoryStream())
{
    …
}

В любом случае, если вам нужно больше памяти и нет ссылок на MemoryStreamбудет исправлено. С другой стороны, размещение всего в памяти всего лишь вопрос фактической памяти в зависимости от размера файла…

Вы должны использовать:

using (MemoryStream mStream = new MemoryStream())
{
    //Don't name this a fileStream if it's actually a MemoryStream?
    using(MemoryStream fileStream = new MemoryStream())
    {
    }
}
Другие вопросы по тегам