Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Переполнение памяти


-matrix- ©   (2006-01-14 21:53:00) 

В программе используются функции типом Tbitmap. На протяжении долгой работы программа постепенно поедает всю оперативную память (;. Мне кажется, что это из-за невозможности реализовать у функции ".free". Как это можно исправить без введения новых типов Tbitmap?
PS Просто это удобно - canvas.draw(0,0,graph), где graph - это та самая функция.


баклан   (2006-01-15 11:37:00) [1]

Набережных С. ©   (15.01.06 11:04) [9]
дык про это и говорю. что-то ваще не то творится )


Набережных С.   (2006-01-15 11:04:00) [2]


> баклан   (15.01.06 10:16) [7]


> имхо, бред

Именно. Кроме того, что b: TBitmap и без того указатель, это еще и локальная переменная, пытаться обратиться к которой за пределами приведенной функции невозможно.


VirEx   (2006-01-15 10:59:00) [3]


>  [7] баклан   (15.01.06 10:16)

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


баклан   (2006-01-15 10:16:00) [4]

result:=@b;

может гоню, но достаточно result:=b; да имысл прямо указатели юзать? когда можно возвращать TBitmap сразу. имхо, бред


antonn   (2006-01-15 09:20:00) [5]

-matrix- ©   (15.01.06 1:36) [5]
PPS Хм, а что за delphiworld-то? Где он находится?

http://www.delphiworld.narod.ru/


-matrix-   (2006-01-15 01:36:00) [6]

2 з. танька: Спасибо!
Решил пересмотреть свой код по твоему примеру - как же это, у одних работает, а у других - нет? Я же тоже самое до опубликования темы делал - не получалось, поедал память... Так вспомнилось, что graph функция вызывала другую bitmap'ную функцию, и она уже давала утечку лишних значений. Так что создал временную bitmap для второй функции - и теперь не ест ничего лишнего.
А все-таки жаль, красиво могло быть, если бы значения не убегали... Имхо, недочет болрандцев.
PS Функции мои, а не с delphiworld'а.
PPS Хм, а что за delphiworld-то? Где он находится? Просто я когда-то был дизайнером одноименного сайта, искалечил его внешний вид (ну, получилось так (; ) и уехал, доступа к сайту месяца 3 не было. Когда приехал, нарисовал классное главное меню - а он (сайт) возьми и пропади. Админа понимаю, дела, времени обновлять не было... Но хороший сайт был. Крупный.


VirEx   (2006-01-14 22:20:00) [7]

используй только один экземпляр Tbitmap, а в функциях работай через указатели:
function getBitmap:Pointer;
var
b:TBitmap
begin
...
b:=TBitmap.create();
b.LoadFromFile и т.п.
result:=@b;
end;

procedure FreeBitmap(b:Pointer);
begin
TBitmap(b).free/destroy;
end;


з. танька   (2006-01-14 22:17:00) [8]


> Не-а! Пробовал еще раньше. Это тоже не идет.

похоже видала я эту функцию. не поворачивает ли она картинку на заданный угол? функция косячная с delphiworld, она создавала два битмапа, один возвращала в результате, а другой просто-так оставался болтаться в памяти. так что через некоторое время прога действительно съедала всю память. дело в том что в моем-то примере утечки нету.. только если функция виновата..

> PS Быстро-то у вас отвечают...

бессонница у меня, да...


-matrix-   (2006-01-14 22:05:00) [9]

напиши свою маленькую процедуру что то типа

Не-а! Пробовал еще раньше. Это тоже не идет.
И, в таком уж случае, мне легче саму функцию модифицировать в процедуру с параметром "var bm:Tbitmap" и перед каждым ее вызовом создавать временный битмап и его уничтожать. Мне-ж что-то оригинальное надо (;
PS Быстро-то у вас отвечают...


з. танька   (2006-01-14 21:57:00) [10]

напиши свою маленькую процедуру что то типа

procedure CanvasDraw(x,y: integer; canvas: TCanvas);
var
 bmp: TBitMap;
begin
 bmp := graph;
 canvas.draw(x,y,bmp);
 bmp.Destroy;
end;


Наверх

Титульная страница Поиск, карта сайта Написать письмо