Статьи по программированию
примеры программного кода
Delphi, Kylix, C, C++, SQL, Visual Basic, Bash, Assembler, 1С
Qt, KOL, MFC, Rx Library, Windows, Linux, Mac OS
TClientDataSet. Утечка памяти при загрузке XML
Опубликовано codeLocker в 24.07.2008 в 15:25.
Hапpимеp, если делаем:
ClientDataSet.Close;
то видим, что память выделилась, но не освободилась.
Если даже делать ClientDataSet.Create и ClientDataSet.Free то все pавно будут утечки.
Пpобовал также пеpед закpытием:
ClientDataSet.CancelUpdates;
ClientDataSet.LogChanges := False;
ClientDataSet.MergeChangeLog;
ClientDataSet.FieldDefs.Clear;
ClientDataSet.IndexDefs.Clear;
ClientDataSet.Params.Clear;
ClientDataSet.Aggregates.Clear;
ClientDataSet.IndexName := '';
ClientDataSet.IndexFieldNames := '';
Все pавно не помогает.
Решения не нашел. Тестировал под D5 под W2000, W98. Также брал midas.dll от D6. Проблема осталась.
КОММЕНТАРИЙ
Действительно, проверка показывает, что при загрузке данных из XML-файла последующее закрытие ClientDataSet не освобождает часть выделенной памяти. Трассировка VCL не выявила ничего подозрительного в открытом коде TClientDataSet. Но часть операций производится COM-объектами, которыми пользуется ClientDataSet и которые находятся в midas.dll.
Установлено, что утечка памяти отсутствует, если данные в ClientDataSet поступают через провайдера, либо при загрузке из файла формата CDS (в котором ClientDataSet сохраняет данные по-умолчанию).
Следовательно, мы имеем проблему при локальном использовании ClientDataSet с файлом XML. Вероятно, в midas.dll при разборке файла XML распределяется память под временные структуры данных, которая потом не освобождается.
Материал похожий на TClientDataSet. Утечка памяти при загрузке XML
- DBGrid компонент c разными цветами удалённые, обновлённые и добавленные записи
- Быстрое копирование таблиц
- TCanvas и освобождение дескрипторов
- TIF в PDF
- TCheckListBox: использование методов LoadFromFile/SaveToFile
- TComboBox.ReadOnly