Утечка памяти создается, если MemoryStream в.NET не закрывается?

По какой-то причине проблема исчезла после установки release_name в качестве первичного ключа в таблице release_stats.

108
задан David Basarab 24 October 2008 в 15:41
поделиться

3 ответа

This is already answered, but I'll just add that the good old-fashioned principle of information hiding means you may at some future point want to refactor:

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

to:

Stream foo()
{    
   ...
}

This emphasizes that callers should not care what kind of Stream is being returned, and makes it possible to change the internal implementation (e.g. when mocking for unit testing).

You then will need be in trouble if you haven't used Dispose in your bar implementation:

void bar()
{    
    using (Stream s = foo())
    {
        // do stuff with s
        return;
    }
}
8
ответ дан 24 November 2019 в 03:28
поделиться

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

-2
ответ дан 24 November 2019 в 03:28
поделиться

Да, есть утечка , в зависимости от того, как вы определяете LEAK и насколько ПОЗЖЕ вы имеете в виду ...

Если под утечкой вы имеете в виду «память остается выделенной, недоступной для использования, даже если вы закончили ее использовать», а под последним вы подразумеваете в любое время после вызова dispose, тогда да, может быть утечка, хотя она не постоянная (т. Е. Для время выполнения ваших приложений).

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

Преимущество оператора using (по сравнению с простым вызовом dispose) состоит в том, что вы можете ОБЪЯВИТЬ свою ссылку в операторе using. Когда оператор using завершается, вызывается не только dispose, но и ваша ссылка выходит за пределы области видимости, фактически обнуляя ссылку и делая ваш объект пригодным для сборки мусора немедленно, не требуя от вас напоминания о написании кода «reference = null».

Хотя отказ от немедленной ссылки на что-то не является классической «постоянной» утечкой памяти, она определенно имеет тот же эффект.Например, если вы сохраните ссылку на MemoryStream (даже после вызова dispose) и немного ниже в своем методе вы попытаетесь выделить больше памяти ... память, используемая вашим потоком памяти, на который все еще ссылается, не будет доступна вам, пока вы не аннулируете ссылку или она не выйдет за пределы области видимости, даже если вы вызвали команду dispose и закончили ее использование.

25
ответ дан 24 November 2019 в 03:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: