2013-07-10 2 views
0

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

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

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

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

ответ

2

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

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

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

Узнайте, какие классы вы используете, реализуете IDisposable и получаете возможность использовать их. В дальнейшем это спасет вас.

+0

Это действительно ответили на мой вопрос. Мне не нужен код, потому что я знаю, как это сделать сам, я просто хотел объяснить, было бы разумно это делать или нет. – Nathan

2

На самом деле избавиться от второго MemoryStream должным образом, вам нужно гнездо ваших using s:

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

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

0

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

using (MemoryStream mStream = new MemoryStream()) 
{ 
    //Don't name this a fileStream if it's actually a MemoryStream? 
    using(MemoryStream fileStream = new MemoryStream()) 
    { 
    } 
} 
Смежные вопросы