Текущий архив: 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.45 MB
Время: 0.012 c