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
объект.