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, поэтому я не знаю, как ее решить ...

Спасибо!


person user1009073    schedule 02.09.2014    source источник
comment
Поскольку вы используете классы, а не записи, вы можете рассмотреть возможность использования TObjectDictionary и создать его с помощью [doOwnsValues]   -  person bummi    schedule 02.09.2014
comment
Я думаю, прежде чем освободить экземпляр словаря, вы должны перебрать его свойство Items, освобождая каждый экземпляр TWordRec, который вы добавили.   -  person 500 - Internal Server Error    schedule 02.09.2014


Ответы (1)


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

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

person Andy_D    schedule 02.09.2014