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