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

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

странная утечка памяти [WinXP]


Venkin ©   (2008-02-01 01:28:00) 

имеем: свежеустановленную  D 2007 ( в комплекте - Indy), windows xp SP2, fastmm4.
новый проект, на форму ложим idhttp1 компоненту, подключаем fastmm4, запускаем проект.
закрываем окно -- получаем сообщение об утечке:

В этом приложении происходят утечки памяти. Утечки блоков маленького размера (исключая ожидаемые утечки зарегистрированные по указателю):

5 - 12 байт: TIdThreadSafeInteger x 1
21 - 28 байт: TIdCriticalSection x 2


заметьте, никаких событий и действий в проекте не делал,только положил компоненту на форму и все.
убрал компоненту idhttp1, убрал все связанное с ней из uses, запустил проект, закрыл окно - никаких утечек нет.
что это такое?


Venkin   (2008-02-03 11:16:00) [1]


> И чего?


хм, наверно ничего страшного, посмотрел у штатного IE тоже счетчик растет :)
окей, всем спасибо ! :)


Johnmen   (2008-02-03 02:48:00) [2]


> просто я смотрю ProcessExplorer-ом, она  открывает несколько
> тредов и постоянно растет счетчик I/O (Other) http://i016.
> radikal.ru/0802/18/efcb9fbf9a55.jpg

И чего?


Venkin   (2008-02-02 00:12:00) [3]


> Это как?

s1 := concat('about:<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">',  #10#13,
'<head>', #10#13, '<meta http-equiv="Content-Type" content="text/html; charset=unicode">', #10#13, '</head>','<body>', '</body>');


это непринципияльно, мне важно знать, верно ли построение событий в коде [9].
почему-то сразу при запуске программа ловит AV... :(


> Если программа во время работы забывает корректно освободить
> два блока по 28 байт, на это можно закрыть глаза, чесслово


просто я смотрю ProcessExplorer-ом, она  открывает несколько тредов и постоянно растет счетчик I/O(Other)
http://i016.radikal.ru/0802/18/efcb9fbf9a55.jpg


DrPass   (2008-02-01 23:51:00) [4]


> Venkin   (01.02.08 12:48) [5]
> другими словами, вы хотите сказать, -- не обращать внимания
> на утечки памяти, оставить все как есть? как же так, это
> ведь не правильно...

Если программа во время работы забывает корректно освободить два блока по 28 байт, на это можно закрыть глаза, чесслово


homm   (2008-02-01 22:46:00) [5]

> procedure TForm1.FormCreate(Sender: TObject);
> begin
> s1 := concat('about:'<head>', #10#13, '</head>','<body>',
> '</body>');

Это как?


Venkin   (2008-02-01 22:43:00) [6]

окей, тогда перейдем к практике :)
как считаете, этот код корректен по отношению к памяти? в том смысле, что не останутся ли тут утечки?

//глобальные переменные
var
 Disp: IDispatch;
 CurrentWB: IWebBrowser;
 Editor: IHTMLDocument2;
 Range: IHTMLTxtRange;
 s1: string;

implementation

procedure TForm1.Webbrowser1DocumentComplete(Sender: TObject;  const pDisp: IDispatch; var URL: OleVariant);
begin
Disp := pDisp;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
s1 := concat('about:'<head>', #10#13, '</head>','<body>', '</body>');
Webbrowser1.Navigate(s1);
end;

procedure TForm1.ButtonBoldClick(Sender: TObject);
begin
if  editor.selection.type_ = 'Text' then begin
Range := (editor.selection.createRange as IHTMLTxtRange);
Range.execCommand('bold', false, emptyparam);
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
// это событие по идее должно быть вызвано перед
// всеми другими, но после загрузки страницы. может его на таймер повесить...?
begin
CurrentWB := Disp as IWebBrowser;
editor := (CurrentWB.Document as IHTMLDocument2);
end;

initialization
OleInitialize(nil);

finalization
OleUninitialize;

end.


Loginov Dmitry   (2008-02-01 22:27:00) [7]

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


Не правильно - это когда ты вызываешь много раз одну и ту же процедуру, в которой выделяется кусок памяти, освобождение которой не делается. Рано или поздно это может привести к реальным сложностям в работе программы. А то, что не осбовождаются глобальные объекты - не беда. Винда очистит все ресурсы самостоятельно. Хотя можно огрести проблемы и с глобальными объектами, если они размещены в DLL, которая тыщу раз загружается и выгружается (но это скорее исключение - так с DLL-ками обычно не работают)


homm   (2008-02-01 13:27:00) [8]

> [5] Venkin   (01.02.08 12:48)
> другими словами, вы хотите сказать, -- не обращать внимания
> на утечки памяти, оставить все как есть?

Не используй эти компоненты, или дорабатывай вручную


ketmar   (2008-02-01 13:00:00) [9]

>[4] Palladin ©(01.02.08 12:28)
тык чтобы использовать DevExpress — это очень экстремально альтернативным надо быть…


Venkin   (2008-02-01 12:48:00) [10]

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


Palladin   (2008-02-01 12:28:00) [11]


> Venkin   (01.02.08 01:28)

ты даже не представляешь какой толмут ликов выдается при использовании DevExpress...


ketmar   (2008-02-01 12:25:00) [12]

конечно. люди не озадачиваются освобождением ресурсов — оставляют эту задачу ОС.


Venkin   (2008-02-01 11:44:00) [13]

с Indy это не связано походу.
сейчас проверил на rxLib 2.75 и дельфи 7 --
утечки по прежнему идут в компонентах: RXGifanimator, RXFormStorage.
есть идеи?


sniknik   (2008-02-01 08:22:00) [14]

если Indy десятый то там есть глюк (а может и не один), после коннекта, хотя бы одного установленного соединения при завершении программы (закрытии соединения) ошибка прерванной процедуры (чтото типа...).
может они и не связанные, но вполне можно предположить что если чтото прерывается (особенно поток), а не завершается нормально... могут быть утечки. ошибка видно только при запуске из под дельфей (там пустой try except, хотя и с длинным пояснением почему и когда считать что можно игнорировать... но все таки).

в общем посмотри, может быть связано
http://www.delphimaster.ru/cgi-bin/forum.pl?id=1189799328&n=4

> заметьте, никаких событий и действий в проекте не делал
ты не делал, он (сам компонент) делал - организовал слушающий поток, цикл в нем (execute)...


Наверх

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