![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Переполнение памяти
-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;