Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.04.2015, 15:17   #1
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию Утечка памяти

У меня на форме есть компонент TImage.
При событиях OnClick и OnMouseMove происходит наложение изображений с помощью Canvas.Draw (позиционное наложение маленьких изображений).

В диспетчере задач память процесса постоянно увеличивается, даже если я только вожу мышью по TImage. То есть утечка памяти происходит именно по изображениям.

Память освобождается при сворачивании окна программы.
Первое, что мне пришло в голову - периодическая очищать Picture (Image1.Picture:=nil), и наносить новые изображения; но при обнулении Picture память процесса всё равно не освобождается.
Использование Destroy и Free (как для Picture, так и для Canvas) выпадает EAccessViolation.
"Canvas:=nil;" компилятор не пропускает.

Как мне освобождать память ?
Периодически сворачивать и разворачивать форму - самый рабочий, но самый некрасивый вариант, к тому же неудобный с точки зрения реализации интерфейса.
Подпись ? Не, не слышал ...
OmegaBerkut вне форума Ответить с цитированием
Старый 08.04.2015, 15:25   #2
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,442
По умолчанию

Цитата:
Как мне освобождать память ?
Рисовать спрайты. Написать сборщик мусора, который будет чистить спрайты которые глубоко зарыты другими спрайтами сверху.
Человек_Борща вне форума Ответить с цитированием
Старый 08.04.2015, 17:22   #3
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию

Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
Рисовать спрайты. Написать сборщик мусора, который будет чистить спрайты которые глубоко зарыты другими спрайтами сверху.
Кажется, что для курсового проекта второго курса это будет слишком круто.
Может можно как то по другому ?
Подпись ? Не, не слышал ...
OmegaBerkut вне форума Ответить с цитированием
Старый 08.04.2015, 17:35   #4
zvygin1964
Старожил
 
Аватар для zvygin1964
 
Регистрация: 19.06.2013
Сообщений: 2,463
По умолчанию

А на сколько это опасно?
Репутация: полный "0"
zvygin1964 вне форума Ответить с цитированием
Старый 08.04.2015, 20:40   #5
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию

Цитата:
Сообщение от zvygin1964 Посмотреть сообщение
А на сколько это опасно?
В моём случае только водить мышью по TImage нужно будет порядка минимум часа.
Программа запускается уже с 10 мегабайтами. Если мышкой постоянно водить по полю, то каждую секунду добавляется порядка 500 килобайт.

Несложно посчитать, что после часа, проведённого в этом приложении размер процесса в оперативной памяти будет занимать порядка 2 гигабайт.

Это если не сворачивать окно.

Это очень опасный баг, и как его устранить - я не знаю.
Подпись ? Не, не слышал ...
OmegaBerkut вне форума Ответить с цитированием
Старый 08.04.2015, 20:43   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

А можно на код взглянуть?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 08.04.2015, 22:12   #7
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
А можно на код взглянуть?
Проект (шахматы).7z , ссылка на Google диск.

Это весь проект; всё, что можно, имеет комментарии.
Проблема с прорисовкой фигур: фигуры рисуются, но, как я писал, засоряют память; освобождаются только при сворачивании окна программы.
Подпись ? Не, не слышал ...
OmegaBerkut вне форума Ответить с цитированием
Старый 09.04.2015, 06:49   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Сразу в лоб два глупых вопроса:
1) А чего не выбрал в качестве канвы DrawGrid?
2) В GetImage есть строка:
Цитата:
result:=TBitmap.Create;
result.LoadFromStream(MemStream);
И все бы ничего, но GetImage у тебя в коде в трех местах результат никуда не возвращает, и уж тем паче не удаляет его, когда тот перестает быть нужным.

Вот тебе и утечка. Переделывай работу с GetImage.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 09.04.2015, 14:17   #9
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Сразу в лоб два глупых вопроса:
1) А чего не выбрал в качестве канвы DrawGrid?
2) В GetImage есть строка:
И все бы ничего, но GetImage у тебя в коде в трех местах результат никуда не возвращает, и уж тем паче не удаляет его, когда тот перестает быть нужным.

Вот тебе и утечка. Переделывай работу с GetImage.
Благодарю за наводку, буду разбираться.
A c DrawGrid больше мороки с его свойствами и методами; в моём случае легче руководствоваться явной привязкой индексов матрицы к координатам на TImage.Canvas.

---

На счёт GetImage: везде, где вызывалась эта функция - результат возвращался сразу в Image.Canvas, результат прорисовывался, правда экземпляр объекта никуда не девался. Вот я и получил утечку.
Спасибо за помощь, ссылка на скачивание архива более недоступна, вопрос закрыт.
Подпись ? Не, не слышал ...

Последний раз редактировалось OmegaBerkut; 09.04.2015 в 14:47.
OmegaBerkut вне форума Ответить с цитированием
Старый 09.04.2015, 14:25   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
в моём случае легче
Хозяин - барин.
Я бы так не делал.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Утечка памяти Vlad2891 Общие вопросы Delphi 11 27.02.2015 16:06
Утечка памяти :( batnik.com C++ Builder 1 09.05.2013 18:09
утечка памяти Кудаив Помощь студентам 1 30.04.2012 18:18
Утечка памяти Juffin Общие вопросы Delphi 3 02.11.2010 12:11
утечка памяти в С++ vengo Общие вопросы C/C++ 9 10.06.2008 21:24