• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

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

    Запись на курс до 25 апреля. Получить промодоступ ...

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

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

Guest

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

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

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

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

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

Вложения

  • ImageZip.rar
    68,2 КБ · Просмотры: 154
L

LuMee

Для начала я бы предложил всю работу со 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

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

LuMee

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

Обучение наступательной кибербезопасности в игровой форме. Начать игру!