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

Тема в разделе ".NET", создана пользователем -, 13 авг 2011.

Статус темы:
Закрыта.
  1. Гость

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

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

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

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

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

    Вложения:

    • ImageZip.rar
      Размер файла:
      68,2 КБ
      Просмотров:
      8
  2. LuMee

    LuMee Well-Known Member

    Регистрация:
    2 май 2006
    Сообщения:
    477
    Симпатии:
    0
    Для начала я бы предложил всю работу со stream'ами (FileStream и MemoryStream в вашем случае) обернуть в using. Думается мне, что именно они в утечке виноваты. Будет что-то такое:
    Код (Text):
    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);
     
  3. Гость

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

    LuMee Well-Known Member

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

Поделиться этой страницей