Delphi - запутался в распределении памяти в TDictionary

В Delphi XE6 у меня есть TDictionary под названием WordDict, который содержит экземпляры TWordRec. Определения:

 WordDict: TDictionary<string, TWordRec>;

...

type
  TWordRec = class
  public
    RemoveAlways: Boolean; // Is this CORP LLC, etc?
    RemoveRestricted: Boolean;
    Replace: Boolean;
    ReplaceWith: string;
    Constructor Create(B1, B2, B3: Boolean; S1: String); overload;
  end;

Когда я создаю и загружаю словарь....

  WordDict := TDictionary<string, TWordRec>.Create;

  WordDict.Add('CO', TWordRec.Create(True, False, False, ''));
  WordDict.Add('CORP', TWordRec.Create(True, False, False, ''));
...

Я сталкиваюсь с утечкой памяти, и, используя AQTime, он показывает, что каждое вхождение моего TWordRec является "утечкой" памяти. Если я создаю записи WordDict как TWordRec, как мне их утилизировать после загрузки? Нужно ли им распоряжаться, так как это не просто указатель в словаре на реальный объект?

Нужно ли утилизировать TWord сразу после загрузки? Я удаляю все записи из моего словаря ТОЛЬКО после закрытия приложения? Я, очевидно, не понимаю, ПОЧЕМУ я получаю утечку памяти на TWordRec, поэтому я не знаю, как ее решить...

Спасибо!

1 ответ

Решение

Вы не получаете утечку памяти на TWordRecскорее TDictionary не ведет себя так, как вы ожидаете. Стандарт TDictionary У класса нет никакого механизма для владения объектом. Если вы измените свой контейнерный класс на TObjectDictionary и создать его с doOwnsValues Опция, установленная, автоматически освобождает принадлежащие объекты при уничтожении, что является ожидаемым вами поведением.

Альтернативой является перебирать элементы, освобождая каждый объект в вашем TDictionary экземпляр, прежде чем, наконец, освободить TDictionary объект.

Другие вопросы по тегам