Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.04.09;
Скачать: CL | DM;

Вниз

Утечка памяти - OLE SysString (MemProof)   Найти похожие ветки 

 
АРІ   (2006-03-04 13:54) [0]

Отлаживаю приложение, и тестирую его в MemProof (версия 0.9.5.0).
Обнаруживается некоторая утечка памяти.

Окно "Resource Counters",  строка "OLE" "SysString".

При работе программы наблюдается прогрессивный рост количества этих "системных строк" ("Resource Count" - "Current#"). По немногу, по полусотне байт за операцию, и вроде бы не заметно, но факт.
Подозрение падает на (наследников) TClientDataSet, временные экземпляры которого создаются при каждой операции, а затем освобождаются. За одну операцию может быть создано и разрушено несколько экземпляров (наследников) TClentDataSet. Все места, где создается/уничтожается TClientDataSet, оформлены в try...finally...end.
Утечек других видов памяти (live pointers и пр.) - не наблюдается.

Дополнительная информация: между несколькими экземплярами (наследников) TClientDataSet передаются указатели на DSBase: IDSBase, интерфейс внутреннего хранилища данных (инкапсулированного в TClientDataSet). В принципе, и они могут где-то оставаться в памяти (но интерфейсные ссылки везде "заниляются").

Что это за "системные строки OLE"? В какую сторону "копать"?
Как можно программно (в своей программе) узнать количество этих строк, чтобы поставить контрольные точки и отыскать место утечки? Возможно, у кого-то есть какие-то другие мысли по этому поводу?

P.S. Исходный код пока не привожу, ибо не знаю, где локализована утечка.


 
АРІ   (2006-03-04 15:14) [1]

Набросал тест.
На форму кинул ADOQuery, ClientDataSet, 2 DataSources, 2 Grids, 2 Buttons.
Прописал следующее:

procedure TForm1.Button1Click(Sender: TObject);
begin
 ADOQuery1.Active := not ADOQuery1.Active;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
 if ADOQuery1.Active then
 begin
   ClientDataSet1.Close;
   ClientDataSet1.SetProvider(ADOQuery1);
   ClientDataSet1.Open;
 end;
end;


И в результате каждого нажатия на Button2, этот самый счетчик OLE SysString в MemProof увеличивается на 9.

Что зарактерно, при каждом открытии ADOQuery1, счетчик OLE SysString тоже прогрессивно увеличивается, но на разные (?) значания, от 10 до 12.

Дополнительная информация: открываемая в ADOQuery1 таблица имеет 22 поля, 4 записи.

Уменьшения значения счетчика OLE SysString я не наблюдал.

То есть, такое поведение является нормальным?
Если количество этих строк неконтролируемо (то есть, они не удаляются), то о чем говорит этот счетчик в MemProof?
Что такое OLE SysString?
В какой области памяти они хранятся, и кто отвечает за их удаление?
Где можно прочитать об этих строках и их поведении?


 
АРІ   (2006-03-04 17:09) [2]

Начинаю чувствовать себя водяным.
"Я водяной, никто не водится со мной" (С)
Или ни у кого никаких соображений на этот счет не имеется?


 
pasha_golub ©   (2006-03-05 17:25) [3]

Имеются. MemProof не всегда корректно обнаруживает МемЛики, вернее иногда видит их там где их нету. Может быть тот случай?



Страницы: 1 вся ветка

Текущий архив: 2006.04.09;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.029 c
4-1137403828
Senator1979
2006-01-16 12:30
2006.04.09
очередь принтера


2-1142811970
Delphi5.01
2006-03-20 02:46
2006.04.09
добавить элемент в динамический массив в начало и в конец


15-1142691694
Parus
2006-03-18 17:21
2006.04.09
Помогите решить задачу!


2-1143105289
Der Nechk@ssoff
2006-03-23 12:14
2006.04.09
Сканирование папки


15-1142318554
Knight
2006-03-14 09:42
2006.04.09
FreeLibrary... Что не так?