Утечка памяти при использовании VirtualTreeview и OTL - PullRequest
3 голосов
/ 13 октября 2010

Я создал небольшое многопоточное приложение, и я пытаюсь преобразовать его в OmniThreadLibrary.Я использую Virtualtreeview для отображения журнала и статуса / результатов.Журнал Vst имеет только два столбца, а запись содержит только два строковых поля (очень просто, внутри записи нет объектов).

Используя проект DEMO, который поставляется с OTL (пул потоков # 11), я изменил проект, чтобы использовать VirtualTreeview вместо списка.Когда я запускаю «Задачу» из демо-версии, утечки памяти нет, но если я запускаю «Выполнить задачу» более одного раза, произойдет утечка памяти.Утечка памяти произойдет, если я выполню какую-либо задачу более одного раза.Если я вообще не использую VirtualTreeView, утечки памяти не происходит в любое время.Просто когда я использую VST и когда задача запускается более одного раза.

Я использую событие FreeNode и очищаю строки, и даже пытался использовать Finalize ...

пример:

procedure TFormMain.vstLogFreeNode(Sender: TBaseVirtualTree;
  Node: PVirtualNode);
var
  LogData: PTreeLogData;
begin
  LogData:=Sender.GetNodeData(Node);

  if Assigned(LogData) then begin
    LogData^.Msgtype := '';
    LogData^.Msg := '';
  end; 
  //Finalize(LogData^);

end;

почему я получаю утечку памяти, когда задача запускается более одного раза?Delphi 2010 с FastMM4 последней версии VirtualTreeview и OTL

Ответы [ 3 ]

10 голосов
/ 14 октября 2010

Событие NodeFree вызывается только для Проверенных узлов, подтвержденных обычно означает узлы, которые показываются один или несколько раз (когда вызывалось событие GetText). См. Утечки памяти при использовании компонента Virtual TreeView

edit : вы можете подтвердить это, проверив количество узлов и посчитав, сколько раз вызывается событие NodeFree.

4 голосов
/ 13 октября 2010

Я не знаю, почему это происходит конкретно, но я знаю, как вы можете это выяснить: включите FullDebugMode в FastMM.(Для этого вам нужно скачать полную версию FastMM из SourceForge.) Включите опцию, которая дает отчет об утечке памяти в файле, и убедитесь, что проект генерирует подробный файл карты.После того, как вы настроите эту настройку, вместо всплывающего окна FastMM предоставит вам очень подробный отчет об утечке памяти с трассировкой стека.Это должно помочь вам сузить суть происходящего.

1 голос
/ 14 октября 2010

Как сказал Мейсон, FastMM4 ваш друг здесь.Возможно, вы захотите взглянуть на этот сеанс CodeRage 2: Борьба с утечками памяти для чайников .В основном показано, как использовать FastMM для предотвращения / обнаружения утечек памяти в Delphi.Был для D2007 но все еще актуален.

Что касается того, почему запуск дважды приводит к утечке, но не запускается один раз, исходя из опыта, это в основном связано с созданием и хранением объекта в поле / переменной без предварительной проверки, назначен ли он, утечка предыдущей ссылки.Создайте так:

TSomething
FMyObject: TMyObject;
[..]

TSomething.Destroy;
begin
  FMyObject.Free;
end;
[...]

//somewhere in code:
FMyObject := TMyObject.Create; //leaks the previous FMyObject

Очевидно, что это не так просто и, вероятно, скрыто в некоторых установщиках или через какой-то список / контейнер ... Здесь я бы предположил добавить в VirtualTreeView без проверки ...

...