Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.46 MB
Время: -0.739 c
4-1137700717
AlexOld
2006-01-19 22:58
2006.04.09
Программирование USB порта


15-1142788979
LordOfRock
2006-03-19 20:22
2006.04.09
Настройка Апача


4-1137944963
Dyakon_Frost
2006-01-22 18:49
2006.04.09
Отключение системных служб


15-1142195946
Volf_555
2006-03-12 23:39
2006.04.09
Как нормально установить компоненты KOL???!!!


2-1143213046
Spellcaster
2006-03-24 18:10
2006.04.09
Перебрать в цикле свойства класса




   Наверх