C# - утечка памяти, нужна помощь

  • Автор темы Guest
  • Дата начала
Статус
Закрыто для дальнейших ответов.
G

Guest

#1
Здравствуйте!

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

Проблема в том, что при каждом сжатии происходит существенная утечка памяти, что хорошо видно в диспетчере задач.

Как решить данную проблему? (закрывать программу нельзя, требуется высвобождать память при запущенной программе)

Исходники программы прикрепляю.
Очень прошу помочь!
 

Вложения

LuMee

Well-known member
02.05.2006
477
0
#2
Для начала я бы предложил всю работу со stream'ами (FileStream и MemoryStream в вашем случае) обернуть в using. Думается мне, что именно они в утечке виноваты. Будет что-то такое:
Код:
byte[] data = null;
using(FileStream fs = new FileStream(imgFileName, FileMode.Open))
{
data = new byte[fs.Length];
fs.Read(data, 0, data.Length);
}

Bitmap bitmap = null;
using (MemoryStream stream = new MemoryStream(data))
{
bitmap = new Bitmap(stream);
}

SaveJpeg(dlg.FileName, bitmap, 50);
 
G

Guest

#3
Спасибо! Проблема решена, использовал функцию Dispose()
 

LuMee

Well-known member
02.05.2006
477
0
#4
Спасибо! Проблема решена, использовал функцию Dispose()
На заметку: самому дергать Dispose не рекомендуется (исключение - реализация своего IDisposable класса). Скажем, если взять такой код:
Код:
FileStream fs = new FileStream(fileName, FileMode.Open);
DoSomething(fs);
fs.Dispose();
, то здесь DoSomething может выкинуть какое нибудь исключение, тогда Dispose не вызовется и память потечет. Опять же, после создания stream'а с ним может выполняться много всяких действий; при написании соответствующей кучи кода про Dispose можно банально забыть. Так что использование блока using и удобнее и надежнее.
 
Статус
Закрыто для дальнейших ответов.