Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

---

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

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

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

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

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


14:29.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru